Während ich diese Antwort schrieb , musste ich mich ausschließlich mit Zeilenumbrüchen s
befassen, anstatt das Flag -flag zu verwenden ( dotall
- Punkt entspricht Zeilenumbrüchen).
Die Sites, die normalerweise zum Testen regulärer Ausdrücke verwendet werden, verhalten sich anders, wenn versucht wird, auf \n
oder übereinzustimmen \r\n
.
Ich bemerkte
Regex101 stimmt nur mit Zeilenumbrüchen überein
\n
( Beispiel - Löschen\r
und es stimmt überein)RegExr Spiele Zeilenumbrüche weder auf
\n
noch auf\r\n
und ich kann nicht etwas finden , um es einen Zeilenumbruch zu machen entspricht, mit Ausnahme desm
-Kennzeichen und\s
( Beispiel )Debuggex verhält sich noch anders:
In diesem Beispiel stimmt es nur mit überein\r\n
, während es
hier nur\n
mit denselben Flags und derselben Engine übereinstimmt
Ich bin mir der m
-flag (mehrzeilig - entspricht ^
dem Anfang und $
dem Ende einer Zeile) voll bewusst , aber manchmal ist dies keine Option. Gleiches \s
gilt für Tabulatoren und Leerzeichen.
Mein Gedanke, das Unicode-Zeilenumbruchzeichen ( \u0085
) zu verwenden, war nicht erfolgreich, also:
- Gibt es eine ausfallsichere Möglichkeit, die Übereinstimmung bei einem Zeilenumbruch (vorzugsweise unabhängig von der verwendeten Sprache) in einen regulären Ausdruck zu integrieren?
- Warum verhalten sich die oben genannten Websites anders (insbesondere Debuggex, das nur
\n
einmal und nur einmal übereinstimmt\r\n
)?
quelle
[\r\n]+
- oder so etwas\r?\n
um beide\r\n
und\n
Zeilenabschlusssequenzen abzugleichen. Es funktioniert nicht für die alte\r
Mac-Syntax, aber diese ist heutzutage ziemlich selten.Antworten:
Ich werde in die entgegengesetzte Richtung antworten.
2) Für eine vollständige Erklärung über
\r
und\n
ich muss auf diese Frage verweisen, die weitaus vollständiger ist, als ich hier posten werde: Unterschied zwischen \ n und \ r?Kurz gesagt, Linux verwendet
\n
für eine neue Linie, Windows\r\n
und alte Macs\r
. Es gibt also mehrere Möglichkeiten, eine neue Zeile zu schreiben. Ihr zweites Tool (RegExr) stimmt beispielsweise mit der Single überein\r
.1)
[\r\n]+
wie von Ilya vorgeschlagen, funktioniert, passt aber auch zu mehreren aufeinanderfolgenden neuen Zeilen.(\r\n|\r|\n)
ist korrekter.quelle
\r
/\n
sind abhängig vom Betriebssystem - das ist eine Sache, die man vielleicht kennt (;)) - aber warum stimmen die beiden Debuggex-Beispiele einmal auf \ r \ n und einmal auf \ n überein? Zumindest ist für mich kein Unterschied (in den Beispielen) sichtbar.\r\n
Text enthalten ist (wenn Sie mit der rechten Maustaste klicken und die Quelle anzeigen, finden Sie sie{{Infobox XC Championships\r\n|Name =
irgendwo). Das zweite Tool ist in Flash geschrieben und beim Lesen der About-Seite etwas fehlerhaft mit Zeilenumbrüchen.(\r\n|\r|\n)
kann einfacher geschrieben werden als\r\n?
\n
Sie haben unterschiedliche Zeilenenden in den Beispieltexten in Debuggex. Besonders interessant ist, dass Debuggex offenbar festgestellt hat, welchen Zeilenendstil Sie zuerst verwendet haben, und alle zusätzlichen Zeilenenden, die in diesen Stil eingegeben wurden, konvertiert.
Ich habe Notepad ++ verwendet, um Beispieltext im Unix- und Windows-Format in Debuggex einzufügen, und was auch immer ich zuerst eingefügt habe, ist das, woran diese Debuggex-Sitzung festhielt.
Sie sollten Ihren Text also in Ihrem Texteditor waschen, bevor Sie ihn in Debuggex einfügen. Stellen Sie sicher, dass Sie den gewünschten Stil einfügen. Debuggex verwendet standardmäßig den Unix-Stil (\ n).
Auch NEL (\ u0085) ist etwas ganz anderes: https://en.wikipedia.org/wiki/Newline#Unicode
(\r?\n)
wird Unix und Windows abdecken. Sie benötigen etwas Komplexeres,(\r\n|\r|\n)
wenn Sie auch mit dem alten Mac übereinstimmen möchten.quelle
In PCRE
\R
entspricht\n
,\r
und\r\n
.quelle
(\r\n|\r|\n)
Dies gilt nur für Frage 1.
Ich habe eine App, die unter Windows ausgeführt wird und ein mehrzeiliges MFC-Editorfeld verwendet.
Das Editor-Feld erwartet CRLF-Zeilenumbrüche, aber ich muss den eingegebenen Text
mit einigen wirklich großen / bösen regulären Ausdrücken analysieren.
Ich wollte mich beim Schreiben der Regex nicht darum kümmern, also
normalisierte ich mich zwischen Parser und Editor hin und her, damit
die Regexs nur verwendet werden
\n
. Ich fange auch Einfügevorgänge ein und konvertiere sie für die Boxen.Das braucht nicht viel Zeit.
Das benutze ich.
quelle
In Python:
oder strenger:
quelle