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 ...
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.
^
nur dem Zeilenanfang entspricht, geben Sie std::regex_constants::match_not_bol
an.
$
nur dem Zeilenende entspricht, geben Sie std::regex_constants::match_not_eol
an.
std::regex_constants::match_not_bol | std::regex_constants::match_not_eol
) ^
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.
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:
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.