Textmuster miteinander vergleichen

CopWorker

Erfahrenes Mitglied
Hallo,

wieder etwas womit ich nicht richtig zurecht komme.
Ist es mit RegEx möglich 2 Text bzw. deren Muster miteinander zu vergleichen?

Ich habe einen Basistext "DS05-04"
In einer Tabelle stehen mehrere Text zum Vergleich bereit.

1. "DS05-03"
2. "DS05-04"
3. "DS05-**"
4. "DS**-04"
5. "DS**-**"
6. "DS0504"
7. "DS05**"
8. "BS05-04"

Das Suchergebnis soll auf 2. 3. 4. u. 5. zutreffen.
Ich hab versucht den Basistext vor dem Vergleich umzubauen zu: "DS05-**", dann "DS**-04" und dann "DS**-**".
Muss aber vorher noch prüfen ob das Format mit '-' in der Mitte und "DS" voran passt. Viel Codegewurstel.

Ich vermute das geht mit RegEx mit einem 1-Zeiler.

Vielen Dank im voraus.
Gruß CopWorker
 
In was für einer Datenbank hast du die Tabele? Willst du den RegEx im SQL oder im Code anwenden? Wen n Code - mit welchem .BET arbeitest du?

Verstehe ich das richtig, du willst diSuchwerte in der Tabelle durch RegEx-Pattern ersetzen?

Dein SuchmusterRegEx Pattern
DS05-**DS05-\d{2}
DS**-04DS\d{2}-04
DS**-**DS\d{2}-\d{2}
 
Hallo Yaslaw,

hab die Tabelle in einer Liste C# List<string> liBuffer;
Die Liste kann ich ja in einer foreach( ) durchgehen.

Problem dabei ist, dass ich das "DS05" nicht im Pattern reinschreiben kann.
Das soll sich nach dem Basistext richten.
Kann man nicht sagen, das an den Stellen an denen ein '*' ist, der Vergleich auf "true" geht.
Besser gesagt, dass an den Stellen kein Vergleich stattfindet.


mfG.
 
Sorry, ich verstehe icht was du sagen willst.
Also, du willst di ersten 4 Zeichen des Basistextes zum Verlgeich nehmen? Schneide sie einfach ab und vergleiche den Rest.
 
Ausgangspunkt ist DS05-04 ?

Gesucht werden soll dann nach * oder beliebigen nummern, nur DS und - bleibt bestehen?
Am ende willst du ein regex in dieser form oder ähnlicher form DS(?:\*|\d)(?:\*|\d)-(?:\*|\d)(?:\*|\d) ?

Es soll aus "DS05-04" die nummerischen Angaben quasi ersetzt werden, in meinem Beispiel durch (?:\*|\d) je nummer?
?: - steht für noncapturing group (wegen den Klammern)
\* - Stern wird escaped damit es wirklich als Stern interpetiert wird
| - oder
\d - nummerischer Wert
Regular Expression Language - Quick Reference
 
Hallo Spyke,
auch an dich vielen Dank erstmal.
Bin noch gar nicht dazu gekommen.
Das teste ich aber heute noch durch.
Ich melde mich aber auf alle Fälle.
Gruß CopWorker
 
Ausgangspunkt ist DS05-04 ?

Gesucht werden soll dann nach * oder beliebigen nummern, nur DS und - bleibt bestehen?
Am ende willst du ein regex in dieser form oder ähnlicher form DS(?:\*|\d)(?:\*|\d)-(?:\*|\d)(?:\*|\d) ?

Es soll aus "DS05-04" die nummerischen Angaben quasi ersetzt werden, in meinem Beispiel durch (?:\*|\d) je nummer?
?: - steht für noncapturing group (wegen den Klammern)
\* - Stern wird escaped damit es wirklich als Stern interpetiert wird
| - oder
\d - nummerischer Wert
Regular Expression Language - Quick Reference
Euch ist allen klar, dass genanntes Muster dann auch sowas findet:
DS*5-0*

Und was auch klar sein muss: Wenn der Ausgangspunkt DS05-04 ist, dann gibt das Pattern oben auch DS05-03 zurück (Was OP oben in seiner Liste hat, welches er aber NICHT zurück erwartet)
Ist es das was du willst?

So wie ich OP verstanden habe, will er eigentlich ein "Regex Rückwärts".
Wenn man egal welches der 5 "Ergebnisse" oben als Pattern im Regex verwenden würde, würde für alle 5 Varianten angewendet auf DS05-04 WAHR herauskommen, während DS05-03 falsch wäre.
Heisst: Für gegebenes DS05-04, welches der angebotenen Regex-Pattern würde Wahr ergeben?
Falls ja, geht meiner Meinung nach nur per Schleife.
Renne durch deine Liste, feuer jedes Pattern gegen DS05-04, falls wahr, merke dir Position (in Liste, Array wo auch immer)
Fertig
 
Hallo,
hab mich noch nicht drum gekümmert.
Musste zwischendurch was anderes machen.
Ich melde mich morgen.
Vielen Dank.
Gruß CopWorker
 
Hallo Zvoni,
du hast Recht.
Ich hab´s mit ´ner Schleife gemacht.
Vergleiche die Zeichen vom Ziel zur Quelle nacheinander.
Im folgenden Beispiel bleibt das Flag BFailed auf "false", was es auch tun soll.

C#:
bool BFailed = false;

string strSource = "DS05-**";
string strTarget = "DS05-03";

for (int i = 0; !BFailed && i < strTarget.Length && i < strSource.Length; i++)
{
    if (!(strTarget[i] == strSource[i] || strSource[i] == '*'))
    {
        iRet = 1;
        iFailedPos = i;
        BFailed = true;
    }
}

Beispiele:
string strSource = "DS05-03";
string strTarget = "DS05-03";
BFailed auf "false"

string strSource = "DS05-13";
string strTarget = "DS05-03";
BFailed auf "true"

string strSource = "DS**-03";
string strTarget = "DS05-03";
BFailed auf "false"

string strSource = "DS0503";
string strTarget = "DS05-03";
BFailed auf "true"

An dem Zeichen wo in der strSource ein '*' steht wird beim Vergleich
zu strTarget ignoriert und als EQUALS behandelt.

Ich ging davon aus, dass das mit RegEx eleganter geht.
Mit C# in Schleifen und Funktionen wie .Substring(,,) geht auch nahezu alles.
Sind halt immer ´ne Menge Code.

Trotzdem vielen Dank.
Gruß CopWorker
 
Von der Logik her:
Ich gehe mal von aus, dass das "*" ein Platzhalter für ein einzelnes Zeichen sein soll.
In dem Fall würde Regex dann eh falsch sein, weil ein Listeneintrag wie DS*-* würde für DS05-04 auch wahr ergeben.

Zur Schleifen-Logik:
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.
Weil dann könntest du auf ein nicht existierendes Zeichen zugreifen wollen (dein letztes Beispiel!)
 
Zurück