phreak87
Goto Top

Regex mittels Regex suchen (Problem: verschiedene Längen)

Hallo RegExperten,

ich habe ein Problem mit dem definieren einer Regex-Regel.
Ich habe eine Regex-Suchmaske (z.B. Test123[A4].C) und möchte eine
Liste durchsuchen (Ebenfalls Regex), welcher Satz zutreffend auf diese Regel ist.
Hauptproblem dabei ist dass die Länge variabel ist:

z.B. sollte gegebener Match zutreffen bei (Liste enthält durch Auflösung von eckigen oder runden Klammern zu kompletten Strings nur noch ggf.Punkte):
Test123
Test123A
Test123A.C
Test123ABC

jedoch nicht bei z.B.
Test123BC

Mein Ansatz bis jetzt:

1. Länge bis zum kürzesten *Prüfling* folgendermaßen definieren (noch easy und funktioniert, jedoch sicher verbesserungswürdig):
[T\.][e\.][s\.][t\.][1\.][2\.][3\.]

2. (Fortsetzung zu 1. Regex): (A oder Punkt(expilizit) oder Ende)
[A\.$][B\.$] => Findet weder Test123 noch Test123A, Match für Test123A. und Test123AB

3. (Fortsetzung zu 1. Regex): (A oder Punkt(expilizit) oder Ende) - Optional
[A\.$]?[B\.$]? => Findet jede Variante, jedoch auch die *falsche* Test123BC ...

Habt Ihr irgendeine Idee, wie ich dieses Problem lösen kann?
Vielen Dank!

Content-ID: 455481

Url: https://administrator.de/contentid/455481

Ausgedruckt am: 20.11.2024 um 00:11 Uhr

lcer00
lcer00 25.05.2019 um 09:55:09 Uhr
Goto Top
Hallo,

ich habe das jetzt 5mal gelesen, und verstehe Dein Anliegen immer noch nicht.

Wie genau sehen die zu durchsuchenden Daten aus und was genau willst Du finden?

Grüße


lcer
139920
139920 25.05.2019 aktualisiert um 10:18:50 Uhr
Goto Top
Zitat von @lcer00:
ich habe das jetzt 5mal gelesen, und verstehe Dein Anliegen immer noch nicht.
Kann ich nur zustimmen, für mich ebenfalls absolut unverständlich worauf der TO hier überhaupt hinaus will.
Phreak87
Phreak87 25.05.2019 um 12:24:32 Uhr
Goto Top
Entschuldigung, ich hoffe ich bekomme das Anliegen dieses mal besser hin mit Varianten,
die mir das gewünschte Ergebnis liefern, jedoch entweder nicht anwendbar oder *zu doof* sind ...

Regex-Suche ist : "Test123ABC"

Suchliste ist :
Test123
Test123A
Test123A.C
Test123ABC
Test123BC

Resultat sollte sein:
Test123
Test123A
Test123A.C
Test123ABC

Folgende Varianten sind nicht anwendbar, würden jedoch das gewünschte Ergebnis liefern:

Suchliste ersetzen durch (geht nicht weil ich die Texte nicht verändern kann):
Test123...
Test123A..
Test123A.C
Test123ABC
Test123BC.

oder Regex-Suche: (mit "Test123" fix) - ginge, jedoch wird das bei mehreren Varianten schrecklich!
^Test123([A\.]|[A\.][B\.]|[A\.][B\.][C\.])$
(A oder punkt) oder (A oder Punkt und B oder punkt) oder (A oder Punkt und B oder Punkt oder C oder Punkt)

deshalb würde ich nach einer kürzeren und besseren Variante suchen.
ich hoffe es ist jetzt klarer was ich meine oder Versuche zu erreichen.

Vielen Dank
139920
139920 25.05.2019 aktualisiert um 12:55:26 Uhr
Goto Top
deshalb würde ich nach einer kürzeren und besseren Variante suchen.
Da die Liste aus Regex-Ausdrücken besteht musst du auch alle Varianten mit denen ein Buchstabe/Ziffer mit Regex dargestellt werden kann auflisten ob du das nun wie oben machst oder z.B. auf diese Weise
^Test123($|ABC|A|\.BC|A\.C|AB\.)$
ist egal, wenn du über Regex suchst musst du das nun mal machen, denn es gibt ja auch \w etc die Buchstaben matchen, die wären also alle aufzulisten.

Ich würde das dann in dem Fall über eine Schleife realisieren die die Suchliste durchgeht und die Zeilen selbst über Regex auf das was das Ziel ist, anwenden und alle Positiven Matches in ein Array schreiben, damit entfällt das Auflisten aller Varianten.

Aber mit den Beispielen ist da noch immer etwas wirr. Mach doch mal anhand deiner konkreten RealLive-Aufgabe ein Beispiel, das viele "Test123" gibt einem keinen plastischen Eindruck von deiner realen Aufgabe.
Phreak87
Phreak87 25.05.2019 um 20:29:12 Uhr
Goto Top
Hey, vielen Dank für deine Antwort.

die Art und Weise das in dieser Form aufzulisten ist zwar möglich aber ich denke
sehr unpraktikabel. Stell dir das ganze nur mal mit [ABCEF][12345][ZTREZ] vor ...
Da würde jede Kombination in tausenden Varianten erscheinen müssen (und in allen möglichen längen).
Wenn es nur ein Buchstabe wäre würde ich \w verwenden, jedoch dürfen es nur bestimmte Zeichen sein.

Dein 2. Satz ist ein Rückwärtsmatch der Varianten auf die Suche. Eine durchaus denkbare Möglichkeit, wenn
das Verfahren auch in einer MongoDB angewendet werden könnte. In der Software hätte ich es wahrscheinlich so
gemacht.

Das Beispiel ist wirr - da geb ich dir Recht. jedoch sind die Daten, die ich Matchen möchte noch wirrer. face-smile - Also
komplett zusammengesöpselte Zeichenketten ...

Der im 1. Post geschriebene Ansatz wäre mir da irgendwie am liebsten ... ich dachte da an look behind oder so:

Sprich: der Regex aus dem 1. Beitrag:
Test123 - (dann A oder Punkt oder Ende) - Wenn nicht Ende dann ... (B oder Punkt oder Ende)
- Problem scheint zu sein dass er das Ende in A nicht akzeptiert - anstatt dessen nach dem Ende
von B sucht - und somit die falschen Ausdrücke liefert.