2011-04-05 05:57:20 +0000 2011-04-05 05:57:20 +0000
45
45
Advertisement

Da ich nur das erste Vorkommen in einer Linie mit Regex

Advertisement

zusammenpasse, bin ich völlig neu in Regex und würde jede Hilfe sehr schätzen.

Die Aufgabe ist einfach. Ich habe eine CSV-Datei mit Datensätzen, die wie folgt 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 Regex-Ausdruck, der nur mit dem ersten Komma übereinstimmt?

Das habe ich versucht: ^.....,. Das stimmt mit dem Komma überein, aber es stimmt auch mit der gesamten Länge der Zeichenfolge vor dem Komma überein, wenn ich also versuche, dies durch ein Leerzeichen zu ersetzen, werden alle Zahlen ebenfalls gelöscht.

Advertisement
Advertisement

Antworten (6)

55
55
55
2011-04-05 06:26:54 +0000

Das übereinstimmende Muster könnte wie folgt aussehen:

^([^,]+),

Das bedeutet, dass

^ 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 würde das ganze Match und Replace so aussehen:

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

Das Ersatzteil nimmt einfach das ganze Ding, das gepasst hat, und ersetzt es durch den ersten Block, den Sie sich gemerkt haben, und hängt ein Leerzeichen an. Das Koma wird “fallen gelassen”, weil es nicht in der ersten Fanggruppe ist.

7
7
7
2012-08-01 21:31:36 +0000
s/,/ /

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

3
Advertisement
3
3
2011-04-05 06:26:08 +0000
Advertisement

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

2
2
2
2015-05-13 00:44:34 +0000

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

s/^(.+?),/ /

, das Zeichen gruppiert, indem es bei jedem Schritt vom Anfang der Zeichenfolge (^) zum Ende ** um ein** Zeichen (.+?) geht, bis es das erste Kommazeichen findet. Diese Gruppe wird zusammen mit dem ersten vorkommenden Komma durch die Gruppe (“) und das Leerzeichen ersetzt.

1
Advertisement
1
1
2015-02-28 21:07:59 +0000
Advertisement

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 “escapen”:

Leerzeichen nach 5-stelliger Postleitzahl ersetzen, am Anfang jeder Zeile

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

Mit Tabulator

\t

Wie oben bedeutet das ^ den Zeilenanfang

( ist eine “escapte Klammer” und markiert den Anfang 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 (Sie könnten die Klammern weglassen, aber dann würde es niemand auf dieser Webseite sehen können : -)

Im Ersetzungsausdruck

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

\t ist ein Tabulatorzeichen

Also sucht der Befehl zum Suchen und Ersetzen nach einer oder mehreren Ziffern, gefolgt von einem Leerzeichen. Dann ersetzt er all das durch die gleiche Gruppe von Ziffern, gefolgt von einem Tabulator.

Ich glaube nicht, dass es eine Möglichkeit gibt, einfach “ein Leerzeichen zu finden, das nach 5 Ziffern kommt”, so dass Sie einfach das Leerzeichen ersetzen können, ohne die Ziffern zu berühren. Sie müssen die 5 Ziffern (die erste Zeichenfolge) gefolgt von einem Leerzeichen (die zweite Zeichenfolge) **finden. Dann, obwohl es überflüssig oder umständlich erscheint, ERSATZEN Sie die ursprüngliche 5-stellige Zeichenfolge durch SELBST, gefolgt vom Tabulator (die zweite Zeichenfolge).

Jeder, der das kennt, vergisst, dass Neulinge keine Ahnung davon haben. Deshalb buchstabiere ich es für Sie, mein Freund.

Ed Poor Math Tutor und pensionierter Computerprogrammierer New York City

0
0
0
2019-11-26 19:24:16 +0000

Um nur das erste Vorkommen eines RegEx-Ausdrucks abzugleichen, entfernen Sie alle Flags. Jeder Regex-Ausdruck verfügt über die folgenden möglichen Flags und verwendet normalerweise standardmäßig das globale Flag, das mehr als ein Vorkommen abdeckt:

  • /g = Mit diesem Flag sucht die Suche nach allen Übereinstimmungen, ohne es - nur die erste Übereinstimmung wird zurückgegeben
  • /i = Groß-/Kleinschreibung wird nicht berücksichtigt
  • /m = Mehrzeilenmodus
  • /s = alle . um das Zeilenvorschubzeichen \n abzudecken
  • /u = Unicode
  • /y = Sticky-Modus (Suche an einer bestimmten Stelle)
Advertisement

Verwandte Fragen

3
12
4
5
5
Advertisement
Advertisement