Textmuster miteinander vergleichen

Du solltest vor der Schleife prüfen: Länge source = länge Target --> wenn source 6 Zeichen und Target 7 Zeichen lang ist, sofort FAILED und erst gar nicht in die Schleife.
Das mit den Stringlängen von Quelle und Ziel fange ich außerhalb der Schleife ab.
for (int i = 0; !BFailed && i < strTarget.Length && i < strSource.Length; i++)

So auch die Situation, ob einer der String nicht "null" und nicht "empty" ist.

Vielen Dank für die Tipps.
Gruß CopWorker
 
Das mit den Stringlängen von Quelle und Ziel fange ich außerhalb der Schleife ab.
for (int i = 0; !BFailed && i < strTarget.Length && i < strSource.Length; i++)

So auch die Situation, ob einer der String nicht "null" und nicht "empty" ist.

Vielen Dank für die Tipps.
Gruß CopWorker
Dir ist klar, dass du den Vergleich dann 6 (7, 8.......) mal durchführst anstatt nur einmal?
und auch dass du dann 6 mal durch die Schleife läufst, nur um beim siebten mal festzustellen, die Länge ist unterschiedlich?


Ungetestet (bin kein C-ler, egal welche Geschmacksrichtung)
C:
if (strTarget.Length==strSource.Length) {  //Eventuell hier noch Check auf "Null" oder "Empty" einbauen
   for (int i = 0; i < strTarget.Length; i++) {
       if (strSource[i]=='*') {
           /*Continue*/         
       } else {
       if (!(strTarget[i] == strSource[i])) {
           iRet = 1;
           iFailedPos = i;
           BFailed = true;
           Break; //Macht keinen Sinn weiter durch die Schleife zu laufen
       }
     }
   }
} else { BFailed = true; }
 
Zuletzt bearbeitet:
Ungetestet (bin kein C-ler, egal welche Geschmacksrichtung)
Nun, mit C# habe ich auch nichts am Hut.
Aber hier geht es ja in erster Linie um einen Algorithmus. Und da gilt: Je weniger Arbeit ich mir mache, desto besser. Nehmen wir das Beispiel von oben:
DS**-**
Hier ist das Asterisk als Platzhalter zu verstehen. Für uns als Programmierer heißt das: "* – interessiert mich nicht."
Was uns eigentlich interessiert ist, dass der Teil mit "DS" und "-" passt. Im Grunde lässt sich das Muster in Substrings aufteilen: "DS**-**" → ["DS", "-"]. Die Substrings müssen (an der richtigen Stelle) passen, dann ist es ein Treffer!
Ich vermute sehr stark, dass C# Funktionen hat um Substrings zu erzeugen und um Strings zu vergleichen. Die zu benutzen wäre natürlich optimal, weil dann die Chance besteht, dass der Algorithmus am Schluss zu effizienten String-Instruktionen herunterkompiliert wird.

Gruß Technipion
 
Nun, mit C# habe ich auch nichts am Hut.
Aber hier geht es ja in erster Linie um einen Algorithmus. Und da gilt: Je weniger Arbeit ich mir mache, desto besser. Nehmen wir das Beispiel von oben:
DS**-**
Hier ist das Asterisk als Platzhalter zu verstehen. Für uns als Programmierer heißt das: "* – interessiert mich nicht."
Was uns eigentlich interessiert ist, dass der Teil mit "DS" und "-" passt. Im Grunde lässt sich das Muster in Substrings aufteilen: "DS**-**" → ["DS", "-"]. Die Substrings müssen (an der richtigen Stelle) passen, dann ist es ein Treffer!
Ich vermute sehr stark, dass C# Funktionen hat um Substrings zu erzeugen und um Strings zu vergleichen. Die zu benutzen wäre natürlich optimal, weil dann die Chance besteht, dass der Algorithmus am Schluss zu effizienten String-Instruktionen herunterkompiliert wird.

Gruß Technipion
Korrekt.
Natürlich hast du recht, dass Substrings deutlich einfacher (und schneller) zu vergleichen sind, aber wissen wir dass das "Präfix" ("DS", "BS" usw.) immer zwei Zeichen lang ist?
Um in seinem Beispiel zu bleiben: Er braucht drei Vergleiche:
1. Ist die Länge gleich?
2. Sind die ersten zwei Zeichen gleich? ("DS", "BS" usw)
3. Ist das fünfte zeichen ein "-"
Das setzt aber voraus, dass sein "Target" immer dasselbe Format hat, und das wissen wir eben nicht

Nur mit dem Umstand, dass er tatsächlich jedes Zeichen vergleicht, ist er dann auch tatsächlich auf der sicheren Seite
 
Zuletzt bearbeitet:
Nur mit dem Umstand, dass er tatsächlich jedes Zeichen vergleicht, ist er dann auch tatsächlich auf der sicheren Seite
Eben nicht, das ist ja gerade das Clevere daran!

Der Algorithmus besteht aus zwei Teilen:
Im ersten Teil wird das Suchmuster geparst. Hierbei muss man sich merken, welcher Substring an welchem Index vorkommt.
Im zweiten Teil muss nur pro Kandidat geprüft werden, ob alle Substrings an passender Stelle zu finden sind.

Ich kann nur keinen Code liefern, weil ich kein C# kann (und auch nicht vorhabe es zu lernen).

Aber im Grunde läuft es darauf hinaus: The key to making programs fast is to make them do practically nothing. ;-).

Gruß Technipion
 
Eben nicht, das ist ja gerade das Clevere daran!

Der Algorithmus besteht aus zwei Teilen:
Im ersten Teil wird das Suchmuster geparst. Hierbei muss man sich merken, welcher Substring an welchem Index vorkommt.
Im zweiten Teil muss nur pro Kandidat geprüft werden, ob alle Substrings an passender Stelle zu finden sind.

Ich kann nur keinen Code liefern, weil ich kein C# kann (und auch nicht vorhabe es zu lernen).

Aber im Grunde läuft es darauf hinaus: The key to making programs fast is to make them do practically nothing. ;-).

Gruß Technipion
Das interessiert mich doch jetzt.
Javascript, php oder in c, oder in was könntest du?
 
Steh ich grad aufm Schlauch oder wäre es nicht mit Regex so ganz simpel?
(ev noch ^ zu beginn des patterns und $ am end, das wirklich nur diese Zeichenfolge im strTarget vorkommen darf)

C#:
Beispiele:
string strSource = "DS05-03";
string strTarget = "DS05-03";
BFailed auf "false"
    string pattern = strSource.Replace("-","\-").Replace("*",".{1}"); //DS05\-03
    BFailed = !Regex.IsMatch(pattern, strTarget);

string strSource = "DS05-13";
string strTarget = "DS05-03";
BFailed auf "true"
    string pattern = strSource.Replace("-","\-").Replace("*",".{1}"); //DS05\-13
    BFailed = !Regex.IsMatch(pattern, strTarget);

string strSource = "DS**-03";
string strTarget = "DS05-03";
BFailed auf "false"
    string pattern = strSource.Replace("-","\-").Replace("*",".{1}"); //DS.{1}.{1}\-03
    BFailed = !Regex.IsMatch(pattern, strTarget);

string strSource = "DS0503";
string strTarget = "DS05-03";
BFailed auf "true"
    string pattern = strSource.Replace("-","\-").Replace("*",".{1}"); //DS0503
    BFailed = !Regex.IsMatch(pattern, strTarget);
 
NICE!
Jetzt ist nur noch die Frage:
Was ist schneller?
4 mal 2 mal Replace und dann 4 Regex,
oder durch ne Schleife laufen?
 
Die Schleife sollte schneller sein.

Bei der Regexlösung haben wir ja die Replaces, diese implizieren Schleifendurchläufe zur Ersetzung der Zeichen und dann haben wir noch die Regexprüfung selbst, welche ebenfalls den zu durchsuchenden Text analysieren muss.
 

Neue Beiträge

Zurück