Jestem całkowicie nowy w wyrażeniach regularnych i byłbym bardzo wdzięczny za wszelką pomoc.
Zadanie jest proste. Mam plik CSV z zapisami o następującej treści:
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ć pozostałe przecinki nietknięte dla każdej linii. Czy istnieje wyrażenie regularne, które będzie pasować tylko do pierwszego przecinka?
Próbowałem to: ^.....,
. To pasuje do przecinka, ale pasuje również do całej długości ciągu poprzedzającego przecinek, więc jeśli spróbuję zastąpić to spacją, wszystkie liczby również zostaną usunięte.
Odpowiedzi:
Pasujący wzór może być:
To znaczy
W np. Perl, całe dopasowanie i zamiana wyglądałoby następująco:
Część zamienna po prostu bierze wszystko, co pasuje, i zastępuje ją pierwszym zapamiętanym blokiem i dodaje spację. Koma jest „upuszczana”, ponieważ nie należy do pierwszej grupy przechwytywania.
źródło
To domyślnie (tzn. Bez
g
opcji) zastępuje tylko pierwsze dopasowanie.źródło
sed
,perl
i kilka innych narzędzi.Ten powinien pasować tylko pierwszy numer i przecinek:
^(\d{5}),
. Jeśli chcesz pożreć wszystko inne w linii, zmień wyrażenie regularne na:^(\d{5}),(.*)$
źródło
\d{5}
i nie[^,]*
? To byłoby co najmniej bardziej ogólne.Bardziej eleganckim rozwiązaniem jest użycie leniwego dopasowywania:
które będą grupować znaki, przesuwając od początku ciągu (
^
) do końca o jeden znak (.+?
) na każdym kroku, aż znajdzie pierwszy znak przecinka. Cała ta grupa wraz z pierwszym wystąpieniem przecinka zostanie zastąpiona przez grupę (\1
) i znak spacji.źródło
*
może być lepsze niż jeden+
, taks/^(.*?),/\1 /
s/^([^,]*),/\1 /
, co pasowałoby do początku, cokolwiek, nie przecinek, potem przecinek. Czy nie wiesz, żes//
to nie zmienia niczego, co nie pasuje?TextPad zawsze miał możliwość używania notacji posiksowej, ale musisz zmienić ustawienia w innym oknie dialogowym. Aby użyć domyślnych ustawień TextPada dla wyrażeń regularnych, musisz „uciec” nawiasami otwierającymi i zamykającymi:
Zamień spację po 5-cyfrowym kodzie pocztowym na początku każdego wiersza
Z zakładką
Jak wyżej ^ oznacza początek linii
\ (jest „nawiasiem ucieczkowym” i oznacza początek pierwszego wyrażenia wyszukiwania, czyli pięciu cyfr
[0–9] + oznacza jedną lub więcej cyfr (nie tylko 5-cyfrowe kody pocztowe)
\) jest kolejnym „nawiasiem ucieczkowym” oznaczającym koniec pierwszego wyrażenia wyszukiwania
[] to tylko spacja (możesz pominąć nawiasy kwadratowe, ale wtedy nikt nie będzie mógł tego zobaczyć na tej stronie :-)
W wyrażeniu zastępczym
\ 1 to pierwsze wyszukiwane wyrażenie, część między nawiasami powyżej (jedna lub więcej cyfr)
\ t jest znakiem tabulacji
Tak więc polecenie wyszukiwania i zamiany szuka jednej lub więcej cyfr, po których następuje spacja. Następnie zastępuje to wszystko tą samą grupą cyfr, po której następuje tabulator.
Nie sądzę, że istnieje sposób, aby po prostu znaleźć „spację występującą po 5 cyfrach”, aby można było po prostu wymienić spację bez dotykania cyfr. Musisz znaleźć 5 cyfr (pierwszy ciąg), a następnie spację (drugi ciąg). Następnie, mimo że wydaje się zbędny lub kłopotliwy, WYMIENIJ oryginalny ciąg 5 cyfr na JEDNEGO, a następnie tabulatora (drugi ciąg).
Każdy, kto to zna, zapomina, że nowicjusze nie mają o tym pojęcia. Dlatego mówię to dla ciebie, przyjacielu.
Ed Poor Math Opiekun i emerytowany programista komputerowy w Nowym Jorku
źródło
Aby dopasować tylko pierwsze wystąpienie wyrażenia regularnego, usuń wszystkie flagi. Każde wyrażenie regularne zawiera następujące możliwe flagi i zwykle domyślnie używa flagi globalnej, która pasuje do więcej niż jednego wystąpienia:
źródło