std :: regex, um mit dem Anfang / Ende der Zeichenfolge übereinzustimmen

8

In JS-regulären Ausdrücken symbolisieren ^ und $ Anfang und Ende der Zeichenfolge . Und nur mit /m modifier (mehrzeiliger Modus) passen sie Anfang und Ende der Zeile - Position vor und nach CR / LF.

Aber in den std :: regex / ECMAscript-Modus-Symbolen ^ und $ match Anfang und Ende der Zeile immer.

Gibt es in Std :: Regex eine Möglichkeit, Anfang und Ende der Zeichenfolge Match-Points zu definieren? Mit anderen Worten: um den JavaScript Multiline-Modus zu unterstützen ...

    
c-smile 22.09.2016, 17:46
quelle

2 Antworten

5

Standardmäßig behandelt der ECMAscript-Modus bereits ^ als Anfangsbeginn und Zeilenbeginn, und $ als End-of-input und Ende der Zeile. Es gibt keine Möglichkeit, den Anfang oder das Ende der Eingabe mit only in Übereinstimmung zu bringen, aber es ist möglich, dass sie nur mit dem Anfang oder Ende der Zeile übereinstimmen:

Beim Aufruf von std::regex_match , std::regex_search oder std::regex_replace , gibt es ein Argument vom Typ std::regex_constants::match_flag_type , das standardmäßig auf std::regex_constants::match_default gesetzt ist.

  • Um anzugeben, dass ^ nur dem Zeilenanfang entspricht, geben Sie std::regex_constants::match_not_bol an.
  • Um anzugeben, dass $ nur dem Zeilenende entspricht, geben Sie std::regex_constants::match_not_eol an.
  • Da es sich bei diesen Werten um Bitflags handelt, geben Sie beides einfach bitweise an - oder sie zusammen ( std::regex_constants::match_not_bol | std::regex_constants::match_not_eol )
  • Beachten Sie, dass Eingabeanfang ohne Angabe von ^ und unabhängig vom Vorhandensein von std::regex_constants::match_not_bol impliziert werden kann, indem Sie std::regex_constants::match_continuous angeben.

Dies wird in der ECMAScript-Grammatikdokumentation auf cppreference.com , was ich im Allgemeinen über cplusplus.com sehr empfehlen kann.

Vorbehalt: Ich habe mit MSVC, Clang + libc ++ und Clang + libstdc ++ getestet, und nur MSVC hat derzeit das korrekte Verhalten.

    
ildjarn 22.09.2016 17:53
quelle
2

Die ^ und $ stimmen Anfang und Ende der Zeichenfolge überein, keine Zeile. Sehen Sie diese Demo , die keine Übereinstimmung in "1\n2\n3" mit ^\d+$ regex findet. Wenn Sie Änderungen hinzufügen (siehe unten), gibt es 3 Übereinstimmungen .

Es gibt keine Option in std::regex , damit die Anker mit dem Anfang / Ende der Zeile übereinstimmen. Sie müssen es mit Änderungen emulieren:

%Vor%

Beachten Sie, dass $ vollständig mit (?=\n|$) "emuliert" werden kann (wo Sie weitere Zeilenabschlusszeichen oder Symbolsequenzen wie (?=\r?\n|\r|$) hinzufügen können), aber mit ^ können Sie keine 100% -Art finden .

Da es keine Lookbehind-Unterstützung gibt, müssen Sie möglicherweise andere Teile Ihres Regex-Musters anpassen, weil (^|\n) häufiger Capturing-Gruppen verwendet als mit einer Lookbehind-Unterstützung.

    
Wiktor Stribiżew 22.09.2016 17:54
quelle

Tags und Links