Ich habe einige Daten, die so aussehen
john, dave, chris
rick, sam, bob
joe, milt, paul
Ich verwende diesen regulären Ausdruck, um die Namen abzugleichen
/(\w.+?)(\r\n|\n|,)/
Dies funktioniert größtenteils, aber die Datei endet abrupt nach dem letzten Wort, was bedeutet, dass der letzte Wert nicht \r\n
mit \n
oder ,
mit EOF endet. Gibt es eine Möglichkeit, EOF in Regex abzugleichen, damit ich es in dieser zweiten Gruppierung korrigieren kann?
Antworten:
Die Antwort auf diese Frage
\Z
hat eine Weile gedauert, bis ich sie herausgefunden habe, aber sie funktioniert jetzt. Beachten Sie, dass umgekehrt der\A
Anfang der gesamten Zeichenfolge übereinstimmt (im Gegensatz zu^
und$
am Anfang einer Zeile).quelle
(\s*)\?>(\s*)\Z
... und nach einigem weiteren Graben hier ist, was in einem Projektordner funktionieren würde :(\s*)\?>(\s*)(\n*)(\W)\Z
FYI: Dies dient dazu, alle schließenden PHP-Tags durch Zeilenumbrüche am Ende der Datei zu ersetzen.\A
funktioniert auch in Visual Studio suchen und ersetzen. Verwenden Sie solche Dinge wie immer mit Vorsicht, aber es ersparte mir eine Menge manuelles Durcheinander, sobald ich froh war, dass es tatsächlich das Richtige tun würde.Scanner
Klasse benutze , um eine ganze Datei auf einmal zu lesen; Wenn ich\Z
als Trennzeichen verwende, wird das nachfolgende Zeilenumbruchzeichen abgeschnitten. Wenn ich das Trennzeichen in geändert habe\z
, bleibt das nachgestellte Zeilenumbruchzeichen erhalten. Es scheint, dass Martin Doreys Antwort auch für Java gilt.EOF ist eigentlich kein Charakter. Wenn Sie eine mehrzeilige Zeichenfolge haben, stimmt '$' sowohl mit dem Ende der Zeichenfolge als auch mit dem Ende einer Zeile überein.
In Perl und seinen Brüdern,
\A
und\Z
passen Sie den Anfang und das Ende der Zeichenfolge an, wobei Sie Zeilenumbrüche völlig ignorieren.GNU-Erweiterungen für POSIX-Regexes verwenden
\`
und\'
für die gleichen Dinge.quelle
In Visual Studio finden Sie EOF wie folgt :
$(?![\r\n])
. Dies funktioniert unabhängig davon, ob Ihre Zeilenenden CR, CRLF oder nur LF sind.Als Bonus können Sie sicherstellen, dass alle Ihre Codedateien einen endgültigen Zeilenumbruch haben:
So funktioniert das:
Suchen Sie ein Zeilenende (eine Übereinstimmung mit der Breite Null), dem weder CR noch LF vorangestellt sind und dem auch CR oder LF nicht folgen. Einige Gedanken werden Ihnen zeigen, warum dies funktioniert!
Beachten Sie, dass Sie durch Ihr gewünschtes Zeilenendezeichen ersetzen sollten, sei es CR, LF oder CRLF.
quelle
Vergleichen Sie das Verhalten von Ryans vorgeschlagenem \ Z mit \ z:
perlre sez:
Eine Übersetzung des Testfalls in Ruby (1.8.7, 1.9.2) verhält sich genauso.
quelle
Müssen Sie wirklich die Zeilentrennzeichen erfassen? Wenn nicht, sollte dieser reguläre Ausdruck alles sein, was Sie brauchen:
Dies setzt voraus, dass alle Teilzeichenfolgen, die Sie abgleichen möchten, wie in Ihrem Beispiel vollständig aus Wortzeichen bestehen.
quelle
Vielleicht versuchen Sie $ (EOL / EOF) anstelle von (\ r \ n | \ n)?
quelle
Vor kurzem habe ich nach so etwas gesucht, aber nach JavaScript.
Stellen Sie dies hier ein, damit jeder mit dem gleichen Problem davon profitieren kann
Grundsätzlich würde dies mit dem Zeilenende übereinstimmen, auf das kein Wagenrücklauf oder neue Zeilenzeichen folgen. Im Wesentlichen ist dies dasselbe wie
\Z
für JavaScript.quelle
Angenommen, Sie verwenden den richtigen Modifikator, um die Zeichenfolge als Ganzes zu behandeln (nicht zeilenweise - und wenn \ n für Sie funktioniert, verwenden Sie sie), fügen Sie einfach eine weitere Alternative hinzu - Ende der Zeichenfolge: (\ r \ n | \ n |, | $)
quelle
/(\w.+?)(\r\n|\n|,|$)/
quelle