Sytuacja kobiet w IT w 2024 roku
21.08.20196 min
Jonny Fox

Jonny FoxCTO and EditorFactory Mind

Samouczek Regex - ściągawka z przykładami

Ten samouczek nauczy cię używać wyrażeń regularnych regex do wyciągania dowolnych informacji z tekstu, oraz jak zachować pełną kontrolę nad wynikami wyszukiwań.

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 do AbC)

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> testAby 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

\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!

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ł.

<p>Loading...</p>