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.
^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.
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
a(b|c) - pasuje do łańcucha, gdzie po a następuje b lub c -> Spróbuj!
a[bc] - jak wyżej
\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
.
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ą):
^
i $
będą dopasowywać początek i koniec linii, zamiast odnosić się do całego łańcucha/aBc/i
pasowałoby do AbC
)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.
[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.
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!
\babc\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.
\Babc\B - pasuje tylko wtedy, gdy wzór jest w pełni otoczony znakami słownymi -> Spróbuj!
([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!
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!
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:
Baw się dobrze i nie zapomnij polecić artykuł, jeśli ci się spodobał.