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

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

Advertisement

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.

Advertisement
Advertisement

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
Advertisement
3
3
2011-04-05 06:26:08 +0000
Advertisement

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
Advertisement
1
1
2015-02-28 21:07:59 +0000
Advertisement

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)
Advertisement

Pytania pokrewne

3
12
5
4
5
Advertisement
Advertisement