Regulären Ausdruck für das Ende der Zeile

Ich versuche zu analysieren, eine GEDCOM-Datei mit regulären Ausdrücken und bin fast dort, aber der Ausdruck packt der nächsten Zeile der text für die Zeilen, wo es ist optional text am Ende der Zeile. Jeder Datensatz sollte eine einzelne Zeile.

Dies ist ein Auszug aus der Datei:

0 HEAD
1 CHAR UTF-8
1 SOUR Ancestry.com Family Trees
2 VERS (2010.3)
2 NAME Ancestry.com Family Trees
2 CORP Ancestry.com
1 GEDC
2 VERS 5.5
2 FORM LINEAGE-LINKED
0 @P6@ INDI 
1 BIRT 

- und dies ist der reguläre Ausdruck, den ich verwende:

(\d+)\s+(@\S+@)?\s*(\S+)\s+(.*)

Dies funktioniert für alle Linien außer denen, die nicht enthalten beliebigen text an das Ende, wie der erste. Zum Beispiel, der Letzte capture-Gruppe für den ersten Datensatz enthält die "1 CHAR UTF-8'.

Hier ein screen shot von regex101.com, die zeigen, wie die lila-capture-Gruppe blutet auf der nächsten Zeile:

Regulären Ausdruck für das Ende der Zeile

Habe ich versucht mit dem $ qualifier zu begrenzen .* um die gerade Linie endet, aber dieser schlägt fehl, da die zweite Zeile ist eine Zeile zu Ende.

Jegliche Hilfe würde sehr geschätzt werden.

Dave

  • \s entspricht Zeilenumbrüche, ersetzen Sie es mit einem normalen Raum, oder [^\S\r\n] (oder \h wenn es PCRE). Siehe regex101.com/r/N2ZWWo/1 (ein ^ Hinzugefügt, mit der multiline-option auch).
  • Großer Dank Wiktor, wenn Sie möchten, erstellen Sie eine Antwort, die ich markieren am besten. Das scheint, den trick zu tun: (\d+) +(@\S+@)? (\S+) *(.)
  • .* ist gierig von Standard-und passen so viel wie Sie können. Versuchen .*?$ zu machen, eine non-greedy match.
Schreibe einen Kommentar