Laden...

[gelöst] Regex: Wort aus Zeichen *und* Zeichenfolge

Erstellt von sugar76 vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.221 Views
S
sugar76 Themenstarter:in
69 Beiträge seit 2017
vor 5 Jahren
[gelöst] Regex: Wort aus Zeichen *und* Zeichenfolge

Hallo,

ein besserer Titel für meine Frage ist mir leider nicht eingefallen 😉

Ich suche einen regulären Ausdruck, der ein Wort matcht, welches folgendes enthält (alles optional):

  • Buchstaben
  • Ziffern
  • Die Zeichenfolge
    Wichtig: Doppelpunkte ohne vorangestelltes Fragezeichen sind nicht im Wort enthalten. Wenn Doppelpunkt, dann muss davor ein Fragezeichen kommen.

Den gesuchten Wörtern ist immer eine Reihe von Doppelpunkten vorangestellt.

Beispiel (die gesuchten Wörter in großer Schrift):
::<>mT❔MFN1:********0340+SO❔iPhone

Mein Ansatz ist, die Wörter mittels Capture Groups auszulesen. Folgende Regex ist mir bisher eingefallen:

:+([\w\d(\:question:)]+)

Das funktioniert nicht 100%, da der Doppelpunkt nach MFN1 im Match enthalten ist (was nicht sein soll):

  • mT❔MFN1: (falsch, der Doppelpunkt am Ende soll nicht enthalten sein)
  • SO❔iPhone (richtig)

Hier kann man damit rumspielen:

Frage: welche Regex matcht die gesuchte Zeichenfolge, aber ignoriert ':' ohne vorangestelltes Fragezeichen?

Gruß

S
sugar76 Themenstarter:in
69 Beiträge seit 2017
vor 5 Jahren

Manchmal hilft es, das Problem zu formulieren und dann kommt man von selbst auf die Lösung ... 😁

Ich habe es einfach so gelöst, dass ich vor dem Matchen die Zeichenfolge '❔' durch '&#39; ersetze. Dann gibt es beim Matchen keine Konflikte mit den anderen Doppelpunkten.

Als Regex verwende ich dann statt

:+([\w\d(\:question:)]+)

diese:

:+([\w\d\\]+)
656 Beiträge seit 2008
vor 5 Jahren

Sieht ein wenig nach UN/EDIFACT aus.
Falls ich damit ins Schwarze treffe, würde ich empfehlen es nicht per Regex zu machen sondern einen (wenn auch minimalistischen) Parser zu schreiben - erstens deshalb, weil die Strings im Normalfall einer gewissen Struktur entsprechen und zweitens weil sowohl das Escape-Zeichen (das Fragezeichen ?) als auch das Komponenten-Trennzeichen (der Doppelpunkt :) über das UNA Segment angepasst/auf andere Zeichen geändert werden können.

49.485 Beiträge seit 2005
vor 5 Jahren

Hallo sugar76,

die Klimmzüge mit dem vorherigen Ersetzen sind nicht nötig. Du kannst einfach eine (Regex-)Alternative verwenden. Also dein Pattern minimalinvasiv umgesetzt, würde dann zu:

:+((\w|\d|?:)+)

oder

:+([\w\d]|?:)+)

herbivore

PS: Ein passender Titel wäre gar nicht so schwer zu finden gewesen, z.B. "Regex: Wort aus Ziffern, Buchstaben und einer Zeichenfolge" oder noch kürzer "Regex: Wort aus Zeichen und Zeichenfolge"