Wyrażenia regularne (z przykładami) - 1

„A teraz opowiem ci o wyrażeniach regularnych. Ten temat jest jednocześnie złożony i prosty. Aby dokładnie zrozumieć wyrażenia regularne, być może będziesz musiał przeczytać dwie lub trzy grube książki, ale mogę cię nauczyć, jak ich używać już teraz."

„Jak doświadczeni programiści lubią żartować, jeśli masz problem i myślisz, że rozwiążesz go za pomocą wyrażeń regularnych, teraz masz dwa problemy”.

"Hmm."

- Mam nadzieję, że nie przestraszyłem cię zbytnio, przyjacielu. Nie?

„Dobrze, dobrze. A więc naszym nowym tematem są wyrażenia regularne”.

„Jeśli zbytnio je uprościmy, wyrażenia regularne będą wzorami dla łańcuchów”.

„Możesz sprawdzić, czy ciąg pasuje do danego wzorca. Możesz także podzielić ciąg na części za pomocą ogranicznika lub wzorca”.

„Ale zacznijmy od czegoś prostego: czym jest wzór?

„W SQL (ale nie w Javie) możesz sprawdzić, czy ciąg pasuje do określonego wzorca. Tak to wygląda:”

name like 'Alex%'

Tutaj nazwa jest zmienną, podobnie jak polecenie sprawdzenia wzorca, a „Alex%” to wzorzec.

W tym przypadku % oznacza dowolny ciąg lub podłańcuch.

Wzór Stringi pasujące do wzoru
„Aleks%” Alex
Alex andr
Alex ander
Alex andra
….
'%X%' Ma x
Ma x im
Ale x andr
'%A' Olg i
Helen i
Ir
_

„W SQL, jeśli musisz określić, że powinien być tylko jeden inny znak, użyjesz znaku podkreślenia: „_”.”

Wzór Stringi pasujące do wzoru
„Aleks%_” Alex
Alex andr
Alex ander
Alex andra
….
'_X' Topór
Bx
Cx
„___” Aaa
Aab
Bbb

"To ma sens."

„Dobrze, przejdźmy więc do wyrażeń regularnych”.

„Wyrażenia regularne zazwyczaj zawierają ograniczenia nie tylko co do liczby znaków, ale także ich „zawartości”. „Każda maska ​​zwykle składa się z dwóch (czasem więcej) części: pierwsza opisuje „preferencje” znaku, a druga liczbę znaków ”.

„Oto kilka przykładów treści :”

Wzór Opis Przykłady
. Dowolna postać 1
\D Dowolna cyfra 7
\D Dowolny niecyfrowy C
\S Spacja, koniec wiersza lub znak tabulacji ''
\S Wszystko oprócz spacji, tabulacji i końca wiersza F
[az] Dowolna litera od a do z z
[0-9] Dowolna cyfra od 0 do 9. 8
\w Dowolny znak słowny C
\W Dowolny znak niebędący słowem _

„Nie będę ich od razu pamiętał, ale to nie wygląda na zbyt trudne”.

„Doskonale, oto przykłady liczby znaków w masce:

Wzór Opis Przykłady
A? Znak „A” występuje raz lub wcale A
B+ Znak „B” występuje jeden lub więcej razy BBBB
C* Znak „C” występuje zero lub więcej razy CCC
D{n} Znak „D” występuje n razy Wzorzec D{4} pasuje do DDDD
E{n,} Znak „E” występuje n lub więcej razy Wzorzec E{2,} pasuje do EEEEEEE
F{n,m} Znak „F” występuje między n a m razy Wzorzec E{2,4} pasuje do EEEE

– To wszystko wydaje się całkiem proste.

„Tak szybko wszystko łapiesz. Zobaczmy teraz, jak to wszystko razem wygląda:”

Wzór Opis Przykłady
[ogłoszenie]? Znak między „a” a „d” występuje raz lub wcale a, b, c, d
[bd,z]+ Znaki „b”, „c”, „d” lub „z” występują raz lub więcej razy b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Cyfry 1, 7, 8 lub 9 występują zero lub więcej razy 1, 7, 9, 9777, 111199
1{5} Cyfra 1 występuje 5 razy 11111
[1,2,a,b]{2} Symbole 1, 2, „a” lub „b” występują dwukrotnie 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Symbole „a” lub 0 występują 2 lub 3 razy aa, a0,00,0a, aaa,000, a00,0a0, a0a

„Wciąż wszystko jasne”.

„Naprawdę? Hmm. Albo wyjaśniłem wszystko naprawdę dobrze, albo zbyt szybko przyswajasz wiedzę. Cóż, tak czy inaczej, to jest dla nas dobre”.

„Oto kilka nowych spostrzeżeń dla Ciebie”.

„Ponieważ wyrażenia regularne są często używane do znajdowania podłańcuchów, możemy dodać dwa dodatkowe znaki (^ i $) do naszych wzorców”.

„^ oznacza, że ​​podłańcuch musi zawierać początek ciągu”.

„$ oznacza, że ​​podłańcuch musi zawierać koniec ciągu”.

„Oto kilka przykładów:”

Wzór Ciąg i podciągi pasujące do wzorca
{3} aaa  aaa  aaa  _  _
{3}$ aaa aaa  aaa
^a{3} aaa  aaa aaa
^a{3}$ aaa aaa aaa

„I jeszcze jeden ważny punkt”.

„W wyrażeniach regularnych następujące znaki mają specjalne znaczenie: [ ] \ / ^ $ . | ? * + ( ) { }. Nazywa się je znakami kontrolnymi. Nie można więc po prostu używać ich w ciągach znaków”.

„Podobnie jak w kodzie Java, należy je zmienić. „I ponownie, podobnie jak w kodzie Java, używany jest do tego znak„\”.

„Jeśli chcemy opisać ciąg składający się z trzech „?” znaków, nie możemy napisać „?{3}”, ponieważ „?” jest znakiem sterującym. Musimy to zrobić tak: \?{3}. Jeśli chcemy użyć znaku „\”, musimy napisać „\\”.

"Ok, rozumiem."

„A teraz kolejna interesująca ciekawostka. W plikach z kodem Java znak „\” musi być również zmieniany w łańcuchach, ponieważ jest to znak kontrolny”.

"Oczywiście."

„Tak więc, jeśli próbujesz zdefiniować wyrażenie regularne Java w ciągu znaków, musisz dwukrotnie zmienić znak „\”.

„Oto przykład:”

Chcę maskę pasującą do „c:\anything”
Teoretycznie wyrażenie regularne powinno wyglądać tak:
jeden znak „c”,
dwukropek,
ukośnik odwrotny,
kropka i gwiazdka (oznaczająca dowolną liczbę znaków). Dodałem spacje dla poprawy czytelności:
c : \ .*
Ale znaki '\' i '.' muszą być zmienione, więc wyrażenie regularne będzie wyglądać tak:
c :   \\ \. *
Lub bez spacji
c: \\ \. *
"W naszym wyrażeniu regularnym powinniśmy mieć trzy ukośniki odwrotne.
Oznacza to, że w pliku Java wyrażenie regularne będzie wyglądać tak:"
String regexp = "c: \\\\ \\. *";

"Wow! Whoa. Teraz już wiem."

„A jeśli zdecydujesz się zagłębić w to, oto kilka dobrych linków:”

Lekcja na Wikipedii