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

Dopasowując tylko pierwsze wystąpienie w linii z Regexem

jestem zupełnie nowy w regexie i byłbym bardzo wdzięczny za wszelką pomoc.

Zadanie jest proste. Mam plik CSV z zapisami, które czytają się tak:

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

Chciałbym zastąpić pierwszy przecinek spacją i pozostawić resztę przecinków nietkniętych, dla każdej linii. Czy istnieje wyrażenie regex, które będzie pasowało tylko do pierwszego przecinka?

Próbowałem tego: ^.....,. To pasuje do przecinka, jednak pasuje również do całej długości łańcucha poprzedzającego przecinek, więc jeśli spróbuję zastąpić to spacja, wszystkie liczby również zostaną usunięte.

Odpowiedzi (6)

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

Wzór dopasowania może być:

^([^,]+),

Oznacza to, że

^ 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

W przypadku np. perla, całość dopasowania i wymiany wyglądałaby jak:

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

Część zamienna po prostu bierze całość, która została dopasowana i zastępuje ją pierwszym blokiem, który zapamiętałeś i dodaje miejsce. Śpiączka jest “upuszczana”, ponieważ nie znajduje się w pierwszej grupie przechwytującej.

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

To, domyślnie (tzn. bez opcji g), zastępuje tylko pierwsze dopasowanie.

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

To powinno pasować tylko do pierwszej liczby i przecinka: ^(\d{5}),. Jeśli chcesz zebrać wszystko inne w linii, zmień regex na to: ^(\d{5}),(.*)$

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

Bardziej eleganckim rozwiązaniem jest zastosowanie leniwego dopasowania:

s/^(.+?),/ /

, które będzie grupować znaki, przechodząc od początku łańcucha (^) do końca przez jeden znak (.+?) na każdym kroku, aż znajdzie pierwszy znak przecinka. Cała ta grupa wraz z pierwszym pojawieniem się przecinka zostanie zastąpiona przez grupę (“) i znak spacji.

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

TextPad zawsze miał możliwość korzystania z notacji poziksów, ale trzeba było zmienić ustawienia w innym oknie dialogowym. Aby użyć domyślnych ustawień TextPada dla wyrażeń regularnych, należy “uciec” z nawiasów otwierających i zamykających:

Wymień spację po 5-cyfrowym kodzie pocztowym, na początku każdej linii

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

Z tab

\t

Jak wyżej, ^ oznacza początek linii

( jest “uciekłym nawiasem” i oznacza początek pierwszego szukanego wyrażenia, czyli, pięć cyfr

[0-9]+ oznacza jedną lub więcej cyfr (nie tylko 5-cyfrowe kody pocztowe)

) jest kolejnym “uciekłym nawiasem” oznaczającym koniec pierwszego wyrażenia wyszukiwania

[] jest tylko znakiem spacji (można pominąć nawiasy, ale wtedy nikt nie będzie mógł go zobaczyć na tej stronie : -)

W wyrażeniu zastępującym

\1 jest pierwszym wyszukiwanym wyrażeniem, część pomiędzy nawiasami powyżej (jedna lub więcej cyfr)

\t jest znakiem tabulatora

Tak więc polecenie szukaj i zastępuj szuka jednej lub więcej cyfr, a następnie spacji. Następnie zastępuje to wszystko tą samą grupą cyfr, po której następuje zakładka.

Nie sądzę, aby istniał jakikolwiek sposób na znalezienie “spacji, która przychodzi po 5 cyfrach”, więc można po prostu zastąpić spację bez dotykania cyfr. Musisz znaleźć** 5 cyfr (pierwszy ciąg), po których następuje spacja (drugi ciąg). Następnie, mimo że wydaje się to zbędne lub uciążliwe, PRZESUŃ oryginalny ciąg 5 cyfr za pomocą ITSELF, a następnie zakładkę (drugi ciąg).

Każdy, kto to wie, zapomina, że nowicjusze nie mają o tym pojęcia. Dlatego właśnie piszę to za ciebie, mój przyjacielu.

Ed Poor Math Tutor i emerytowany programista komputerowy Nowy Jork

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

Aby dopasować tylko pierwsze wystąpienie dowolnego wyrażenia regex, usuń wszystkie flagi. Każde wyrażenie regeksowe posiada następujące możliwe flagi i zazwyczaj domyślnie używa flagi globalnej, która pasuje do więcej niż jednego wystąpienia:

  • /g = Z tą flagą wyszukiwane są wszystkie mecze, bez niej - zwracany jest tylko pierwszy mecz
  • /i = wielkość liter nieczytelna
  • /m = tryb wielowierszowy
  • /s = wszystkie . aby dopasować znak nowej linii \n
  • /u = unicode
  • /y = tryb lepki (wyszukiwanie w określonej lokalizacji)