Samouczek Regex - ściągawka z przykładami
Wyrażenia regularne (regex lub regexp) są niezwykle przydatne do wyciągania informacji z dowolnego tekstu poprzez wyszukiwanie jednego lub więcej dopasowań określonego wzorca (np. określonej sekwencji znaków ASCII lub znaków unicode).
Zakres zastosowań sięga od walidacji do przetwarzania/zamiany łańcuchów znaków i scrapowania stron internetowych.
Jedną z najciekawszych cech jest to, że po zapoznaniu się ze składnią, możesz używać tego narzędzia w (prawie) wszystkich językach programowania (JavaScript, Java, VB, C#, C / C++, Python, Perl, Ruby, Delphi, R, Tcl i wiele innych) z małymi różnicami dotyczącymi obsługi najbardziej zaawansowanych funkcji i wersji składni obsługiwanych przez poszczególne silniki.
Zacznijmy od spojrzenia na kilka przykładów wraz z wyjaśnieniami.
Podstawowe tematy
Kotwice — ^ i $
^The - pasuje do każdego łańcucha, który zaczyna się na The -> Spróbuj!
end$ - pasuje do każdego łańcucha, który kończy się na end
^The end$ - Dokładne dopasowanie łańcucha (zaczyna się i kończy na The end)
roar - pasuje do każdego łańcucha, który ma w sobie słowo roar.
Kwantyfikatory — *+? i {}
abc* - pasuje do łańcucha ab, po którym następuje zero lub więcej c -> Spróbuj!
abc+ - pasuje do łańcucha, gdzie po ab następuje jedeno lub więcej c
abc? - pasuje do łańcucha, gdzie po ab następuje zero lub jedno c.
abc{2} - pasuje do łańcucha, gdzie po ab następuje 2 c
abc{2,} - pasuje do łańcucha, gdzie po ab następuje 2 lub więcej c
abc{2,5} - pasuje do łańcucha, gdzie po ab następuje od 2 do 5 c
a(bc)* - pasuje do łańcucha, gdzie po a następuje zero lub więcej powtórzeń sekwencji bc
a(bc){2,5} - pasuje do łańcucha, gdzie po a następuje od 2 do 5 powtórzeń sekwencji bc
Operator LUB — | lub []
a(b|c) - pasuje do łańcucha, gdzie po a następuje b lub c -> Spróbuj!
a[bc] - jak wyżej
Klasy znaków — \d \w \s i .
\d - pasuje do jednego znaku, który jest cyfrą.... Spróbuj!
\w - pasuje do znaku słownego (znak alfanumeryczny plus podkreślenie) -> Spróbuj!
\s - pasuje do znaki niedrukowalne (zawiera taby i nowe linie)
. - pasuje do każdego znaku -> Spróbuj!
Używaj operatora .
ostrożnie, ponieważ często klasy znaków - zwykłe lub negowane (które będziemy omawiać w następnej kolejności) są szybsze i bardziej precyzyjne.
\d
, \w
oraz \s
mają także zanegowane odpowiedniki \D
, \W
i \S
.
Na przykład, \D
wykona odwrotne dopasowanie w stosunku do tego uzyskanego z \d
.
\D - pasuje do jednego znaku który nie jest cyfrą... Spróbuj!
Znaki ^.[$()|*+?{\
jeżeli mają zostać potraktowane dosłownie, to muszą zostać poprzedzone znakiem ucieczki \
, ponieważ mają one szczególne znaczenie.
\$\d - pasuje do łańcucha, który ma $ przed jedną cyfrą -> Spróbuj!
Zauważ, że możesz dopasować również znaki niedrukowalne, takie jak tabulacje \t
, nowe linie \n
, znaki powrotu \r
.
Flagi
Uczymy się, jak skonstruować regex, ale nie wspomnieliśmy o podstawowej koncepcji: flagach.
Regex zazwyczaj znajduje się w formie / abc/
, gdzie szukany wzorzec jest ograniczony przez dwa znaki ukośnika /
. Na koniec możemy określić flagę z tymi wartościami (możemy również łączyć je ze sobą):
- g (global) nie kończy pracy po pierwszym dopasowaniu, rozpoczynając ponowne wyszukiwanie od końca poprzedniego dopasowania
- m(multi-line) gdy użyjemy tej opcji
^
i$
będą dopasowywać początek i koniec linii, zamiast odnosić się do całego łańcucha - i(insensitive) sprawia, że całe wyrażenie jest niewrażliwe na wielkość liter (na przykład
/aBc/i
pasowałoby doAbC
)
Tematy średniozaawansowane
Grupowanie i przechwytywanie - ()
a( bc) - nawiasy tworzą grupę przechwytującą o wartości bc -> Spróbuj!
a(?: bc)* - używając ?: wyłączamy grupę przechwytującą -> Spróbuj!
a(?<foo> bc) używając ?<foo> umieszczamy nazwę dla grupy -> Spróbuj!
Ten operator jest bardzo przydatny, gdy potrzebujemy wyodrębnić informacje z ciągów znaków lub danych przy użyciu preferowanego języka programowania. Wszelkie powtórzenia przechwycone przez grupy zostaną wyeksponowane w postaci klasycznej tablicy.
Jeśli wybierzemy nazwę grupy (używając (?<foo>...)
), będziemy w stanie uzyskać dostęp do tych grup w postaci słownika, w którym klucze będą nazwą każdej grupy.
Wyrażenia klamrowe - []
[abc] - pasuje do łańcucha, który posiada albo a albo b albo c -> to to samo co a|b|c -> Spróbuj!
[a-c] - To samo co wyżej.
[a-fA-F0-9] - ciąg reprezentujący jedną cyfrę szesnastkową, z dowolną wielkości liter -> Spróbuj!
[0-9]% - łańcuch, który posiada znak od 0 do 9 przed znakiem %.
[^a-zA-Z] - łańcuch, który nie posiada litery od a do z lub od A do Z. W tym przypadku ^ jest używany jako negacja wyrażenia -> Spróbuj!
Pamiętaj, że w wyrażeniach klamrowych wszystkie znaki specjalne (w tym odwrotny ukośnik \
) tracą swoje specjalne znaczenie: dlatego nie będziemy stosować znaków ucieczki.
Chciwe i leniwe dopasowanie
Kwantyfikatory (* + {}
) są chciwymi operatorami, więc rozszerzają dopasowanie tak bardzo, jak tylko mogą.
Na przykład, <.+>
pasuje do <div>simple div</div>
w This is a <div> simple div</div> test
. Aby złapać tylko tag div
, możemy użyć ?
, aby uczynić ją leniwą:
<.+?> - dopasowuje dowolny znak jeden lub więcej razy zawarty wewnątrz < i > , rozwijając w razie potrzeby -> Spróbuj!
Zauważ, że lepszym rozwiązaniem powinno być unikanie stosowania . na rzecz bardziej rygorystycznego regexu:
<[^<>]+> - pasuje do dowolnego znaku z wyjątkiem < lub > jeden lub więcej razy zawartych wewnątrz < i > -> Spróbuj!
Tematy zaawansowane
Granice — \b i \B
\b abc\b - przeprowadza wyszukiwanie "tylko całych słów" -> Spróbuj!
\b
reprezentuje kotwicę jako karetę (jest podobny do $
i ^
) dopasowujący pozycje, gdzie jedna strona jest znakiem słowa (jak \w
), a druga strona nie jest znakiem słowa (na przykład może to być początek łańcucha lub znak spacji).
Posiada własną negację, \B
. To pasuje do wszystkich pozycji, do których nie pasuje \b
ale może, jeśli chcemy znaleźć wzór, który jest w pełni otoczony znakami słowa.
\B abc\B - pasuje tylko wtedy, gdy wzór jest w pełni otoczony znakami słownymi -> Spróbuj!
Referencje zwrotne — \1
([abc])\1 - używając \1 pasuje do tego samego tekstu, który został dopasowany przez pierwszą grupę przechwytującą -> Spróbuj!
([abc])([de])\2\1 - możemy użyć \2 (\3, \4, etc.) aby zidentyfikować ten sam tekst, który został dopasowany przez drugą (trzecią, czwartą, etc.) grupę przechwytującą -> Spróbuj!
(?<foo>[abc])\k<foo> - przypisujemy nazwę foo do grupy i odnosimy się do niej później (k<foo> ). Wynik jest taki sam jak w przypadku pierwszego regexa -> Spróbuj!
Spójrz przed siebie i za siebie — (?=) i (?<=)
d(?=r) - dopasowuje d tylko wtedy, gdy następuje po nim r, ale r nie będzie częścią ogólnego dopasowania regex -> Spróbuj!
(?<= r) d - pasuje do d tylko wtedy, gdy jest poprzedzone przez r, ale r nie będzie częścią ogólnego dopasowania regex -> Spróbuj!
Możesz użyć również operatora negacji!
d(?! r) - pasuje do d tylko wtedy, gdy nie następuje po nim r, ale r nie będzie częścią ogólnego dopasowania regex -> Spróbuj!
(?<! r)d - pasuje do d tylko wtedy, gdy jest nie jest poprzedzone przez r, ale r nie będzie częścią ogólnego dopasowania regex -> Spróbuj!
Podsumowanie
Jak widziałeś, zakres aplikacji regex może być wieloraki/bardzo szeroki i jestem pewien, że rozpoznałeś przynajmniej jedno z tych zadań wśród tych, które widziałeś w swojej karierze dewelopera, tutaj krótka lista:
- walidacja danych (na przykład sprawdzenie, czy łańcuch przechowujący czas jest dobrze sformatowany)
- scraping danych (w szczególności scraping stron internetowych, znajdź wszystkie strony, które zawierają pewien zestaw słów, ostatecznie w określonej kolejności)
- wrangling danych (przekształcanie danych z "surowego" do innego formatu)
- parsowanie łańcuchów (na przykład przechwytywanie wszystkich parametrów URL GET, przechwytywanie tekstu wewnątrz zestawu nawiasów)
- zmiana łańcuchów znaków (na przykład, nawet podczas sesji kodowania przy użyciu wspólnego IDE do tłumaczenia klasy Java lub C# do odpowiedniego JSON-a - zastąpienie ";" przez "," zamiana liter na małe, wycięcie deklaracji typu itp.)
- kolorowanie składni, zmiana nazwy pliku, węszenie pakietów pakietów i wiele innych aplikacji obejmujących przetwarzanie stringów (gdzie dane nie muszą być tekstowe)
Baw się dobrze i nie zapomnij polecić artykuł, jeśli ci się spodobał.