Regulärer Ausdruck: Matching bis zum Ende eines Strings [gelöst]



  • Ich möchte einen regulären Ausdruck finden, welcher den folgenden String matched:

    SEMA V23-2 (11225) 003 - Haus1

    Der Ausdruck SEMA[\s]+V[\d]{2}[\d\D]* funktioniert zwar, ist aber etwas missverständlich. Der Ausdruck SEMA[\s]+V[\d]{2}[.]* ist verständlicher, funktioniert aber nicht. Auch der Ausdruck [.]* funktioniert nicht.

    Hat jemand eine Ahnung warum?


  • Mod

    SEMA[\s]+V[\d]{2}.*? Innerhalb eines Sets ist ein Punkt nur ein Punkt (ebenso alle anderen Zeichen, außer \ und ]).

    PS: Das Internet kennt viele Regex-Helferseiten, die dir - unter anderem - bestehende Regexes erklären, bzw. beim Entwickeln helfen können. Siehe beispielsweise hier.



  • @SeppJ
    Dankeschön, es funktioniert.

    Die Webseite ist gut, werde ich mir merken.


  • Mod

    Deine ganzen Sets sind ein bisschen komisch, weil sie jeweils nur einen Token enthalten. Vielleicht weil du den Ausdruck hier für das Forum vereinfacht hast, oder weil du das besser lesbar findest, aber eigentlich würde da wohl so ziemlich jeder Hobby-Regexnutzer SEMA\s+V\d{2}.* schreiben und auch ohne Schwierigkeiten verstehen. Eventuell sogar \d\d statt \d{2}.



  • Wofür überhaupt das .* am Ende? Oder hast du das in einer Group drin? Evtl. vorne verankern und regex_search statt regex_match?



  • @SeppJ

    Nochmals Danke. Mit SEMA\s+V\d\d.* funktioniert es auch und sieht sehr gut aus.

    Und ich habe einfach nur wenig Erfahrung mit regulären Ausdrücken.



  • @wob sagte in Regulärer Ausdruck: Matching bis zum Ende eines Strings [gelöst]:

    Wofür überhaupt das .* am Ende? Oder hast du das in einer Group drin? Evtl. vorne verankern und regex_search statt regex_match?

    Mein Programm nutzt std::regex_match und der regulärer Ausdruck kommt aus einer Konfigurationsdatei. Vor daher ist es mir aktuell lieber wenn ich nur die Konfigurationsdatei anpasse.


  • Mod

    @Quiche-Lorraine sagte in Regulärer Ausdruck: Matching bis zum Ende eines Strings [gelöst]:

    der regulärer Ausdruck kommt aus einer Konfigurationsdatei.

    Je nachdem, wer Zugriff auf diese Konfigurationsdatei hat, ist das übrigens ein lustiges Angriffsszenario. Harmlos aussehende Regexes können exponentielle Laufzeiten haben, wodurch ein Angreifer einen Server für Millionen von Jahren in eine Regexauswertung schicken kann, wenn er Kontrolle über eine Regex bekommt, die dieser auswertet. Oder umgekehrt auf den Text, der von einer (aus Unwissen) exponentiell formulierten Regex ausgewertet wird.

    (Das ist übrigens nicht rein theoretisch. Bei uns in der Firma haben wir mal versehentlich(!) ein Loggingsystem ge-DOS-t, weil das Regexauswertungen gemacht hat, und wir etwas in eine Lognachricht geschrieben haben, das diese Regex nicht gut vertragen hat. Und wir reden hier von unabsichtlicher, völlig harmloser, normaler Zeichensetzung! Die Regex war nämlich dummerweise so geschrieben, dass sie exponentiell in der Anzahl der Minuszeichen war. Zum Glück war ich beim Debugging dabei und konnte eine bessere, äquivalente Regex vorschlagen 🙂 )



  • Nicht nur DOS Ausführungszeit ist ein Problem, Regex-Implementierungen kacken bei passender Regex/Pattern Kombination auch gerne mal mit Stack-Overflows ab.

    EDIT: Ähm. Abkacken ist natürlich auch eine Form von DOS.


  • Gesperrt

    Ich werfe mal: https://regex101.com/ in die Runde...


Anmelden zum Antworten