it-swarm.com.de

Nur das erste Vorkommen in einer Zeile mit Regex abgleichen

Ich bin völlig neu in Regex und würde mich über jede Hilfe sehr freuen.

Die Aufgabe ist einfach. Ich habe eine CSV-Datei mit Datensätzen, die folgendermaßen lauten:

12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890
12345,67890,12345,67890

Ich möchte das erste Komma durch ein Leerzeichen ersetzen und den Rest der Kommas für jede Zeile intakt lassen. Gibt es einen regulären Ausdruck, der nur mit dem ersten Komma übereinstimmt?

Ich habe es versucht: ^.....,. Dies stimmt mit dem Komma überein, entspricht jedoch auch der gesamten Länge der Zeichenfolge vor dem Komma. Wenn ich also versuche, diese durch ein Leerzeichen zu ersetzen, werden auch alle Zahlen gelöscht.

37
cows_eat_hay

Das passende Muster könnte sein:

^([^,]+),

Das bedeutet

^        starts with
[^,]     anything but a comma
+        repeated one or more times (use * (means zero or more) if the first field can be empty)
([^,]+)  remember that part
,        followed by a comma

In z.B. Perl, das ganze Spiel und Ersetzen würde so aussehen:

s/^([^,]+),/\1 /

Das Ersatzteil nimmt nur das Ganze, das zusammen passt, und ersetzt es durch den ersten Block, an den Sie sich erinnert haben, und fügt ein Leerzeichen hinzu. Das Koma wird "fallen gelassen", da es nicht zur ersten Erfassungsgruppe gehört.

45
Mat
s/,/ /

Dies ersetzt standardmäßig (d. H. Ohne die Option g) nur die erste Übereinstimmung.

6
Mork

Eine elegantere Lösung ist die Verwendung von Lazy Matching:

s/^(.+?),/\1 /

das gruppiert Zeichen, indem es vom Anfang der Zeichenfolge (^) zum Ende um eins Zeichen (.+?) bei jedem Schritt wechselt, bis das erste Komma gefunden wird. Alle diese Gruppen werden zusammen mit dem ersten Komma durch Gruppen- (\1) und Leerzeichen ersetzt.

2
ghost28147

Dies sollte nur mit der ersten Zahl und dem Komma übereinstimmen: ^(\d{5}),. Wenn Sie alles andere in der Zeile verschlingen möchten, ändern Sie die Regex in: ^(\d{5}),(.*)$

2
alex

TextPad hatte immer die Möglichkeit, die Posix-Notation zu verwenden, aber Sie müssen die Einstellungen in einem anderen Dialogfeld ändern. Um die Standardeinstellungen von TextPad für reguläre Ausdrücke zu verwenden, müssen Sie die öffnenden und schließenden Klammern "maskieren":

Ersetzen Sie das Leerzeichen nach der 5-stelligen Postleitzahl am Anfang jeder Zeile

^\([0-9]+\)[ ]

Mit Reiter

\1\t

Wie oben bedeutet ^ Zeilenanfang

\ (ist eine "maskierte Klammer" und markiert den Beginn des ersten Suchausdrucks, d. h. die fünf Ziffern

[0-9] + bedeutet eine oder mehrere Ziffern (nicht nur 5-stellige Postleitzahlen)

\) ist eine weitere "maskierte Klammer", um das Ende des ersten Suchausdrucks zu markieren

[] ist nur ein Leerzeichen (man könnte die Klammern weglassen, aber dann könnte es niemand auf dieser Webseite sehen :-)

Im Ersetzungsausdruck

\ 1 ist der erste Suchausdruck, der Teil zwischen Klammern (eine oder mehrere Ziffern)

\ t ist ein Tabulatorzeichen

Der Befehl Suchen und Ersetzen sucht also nach einer oder mehreren Ziffern, gefolgt von einem Leerzeichen. Dann ersetzt es alles durch die gleiche Gruppe von Ziffern, gefolgt von einem Tabulator.

Ich glaube nicht, dass es einfach eine Möglichkeit gibt, "ein Leerzeichen nach 5 Ziffern" zu finden, sodass Sie das Leerzeichen einfach ersetzen können, ohne die Ziffern zu berühren. Sie müssen find die 5 Ziffern (die erste Zeichenfolge) gefolgt von dem Leerzeichen (die zweite Zeichenfolge). Dann, obwohl es überflüssig oder umständlich zu sein scheint, ERSETZEN Sie die ursprüngliche Zeichenfolge mit 5 Ziffern mit ITSELF, gefolgt von dem Tabulator (der zweiten Zeichenfolge).

Jeder, der das weiß, vergisst, dass Neulinge keine Ahnung davon haben. Deshalb schreibe ich es für dich aus, mein Freund.

Ed Poor Math Tutor und pensionierter Computerprogrammierer in New York City

1
user423655