Expresii regulate (cu exemple) - 1

„Și acum vă voi spune despre expresiile obișnuite. Acest subiect este atât complex, cât și simplu în același timp. Pentru a înțelege bine expresiile obișnuite, este posibil să aveți nevoie să citiți două sau trei cărți consistente, dar vă pot învăța cum să le folosiți. chiar acum."

„Așa cum le place programatorilor experimentați să glumească, dacă ai o problemă și crezi că o vei rezolva cu expresii obișnuite, acum ai două probleme.”

— Hmm.

— Sper că nu te-am speriat prea tare, prietene. Nu?

"Bine, bine. Deci, noul nostru subiect este expresiile regulate."

„Dacă le simplificăm excesiv, expresiile regulate sunt modele pentru șiruri.”

„Puteți verifica dacă un șir se potrivește cu un anumit model. De asemenea, puteți împărți un șir în părți folosind un delimitator sau un model.”

„Dar să începem cu ceva simplu: ce este un model?

„În SQL (dar nu în Java), puteți verifica dacă un șir se potrivește cu un anumit model. Iată cum arată:”

name like 'Alex%'

Aici numele este o variabilă, cum este o comandă pentru a verifica un model, iar „Alex%” este modelul.

În acest caz, % înseamnă orice șir sau subșir.

Model Șiruri care se potrivesc cu modelul
„Alex%” Alex
Alex andr
Alex ander
Alex andra
....
'%X%' Ma x
Ma x im
Ale x andr
'%A' Olg a
Helen a
Ir a

„În SQL, dacă trebuie să specificați că ar trebui să existe doar un alt caracter, atunci ar trebui să utilizați caracterul de subliniere: „_”.”

Model Șiruri care se potrivesc cu modelul
„Alex%_” Alex
Alex andr
Alex ander
Alex andra
....
'_X' Axe
Bx
Cx
'___' Aaa
Aab
Bbb

"Are sens."

— Bine, atunci să trecem la expresiile regulate.

„Expresiile obișnuite includ de obicei restricții nu numai asupra numărului de caractere, ci și asupra „conținutului” acestora. „Orice mască constă de obicei din două (uneori mai multe) părți: prima descrie „preferințele” caracterului, iar a doua descrie numărul de caractere. ."

„Iată câteva exemple de conținut :”

Model Descriere Exemple
. Orice personaj 1
\d Orice cifră 7
\D Orice non-cifră C
\s Un spațiu, o întrerupere de linie sau un caracter de tabulație ' '
\S Orice, în afară de spații, file și rupturi de rând f
[az] Orice literă de la a la z z
[0-9] Orice cifră de la 0 la 9. 8
\w Orice caracter de cuvânt c
\W Orice caracter non-cuvânt _

„Nu le voi aminti imediat, dar nu pare prea greu”.

„Excelent, atunci iată exemple de numărul de caractere dintr-o mască:

Model Descriere Exemple
A? Caracterul „A” apare o dată sau deloc A
B+ Caracterul „B” apare o dată sau de mai multe ori BBBB
C* Caracterul „C” apare de zero sau de mai multe ori CCC
D{n} Caracterul „D” apare de n ori Modelul D{4} se potrivește cu DDDD
E{n,} Caracterul „E” apare de nu sau mai multe ori Modelul E{2,} se potrivește cu EEEEEEE
F{n,m} Caracterul „F” apare între n și m ori Modelul E{2,4} se potrivește cu EEEE

— Totul pare destul de simplu.

„Îți înțelegi totul atât de repede. Acum hai să vedem cum arată totul împreună:”

Model Descriere Exemple
[anunț]? Un caracter între „a” și „d” apare o dată sau deloc a, b, c, d
[bd,z]+ Caracterele „b”, „c”, „d” sau „z” apar de una sau de mai multe ori b, bcdcdbdbdbdbzzzzbbzbzb, zbz
[1,7-9]* Cifrele 1, 7, 8 sau 9 apar de zero sau de mai multe ori 1, 7, 9, 9777, 111199
1{5} Cifra 1 apare de 5 ori 11111
[1,2,a,b]{2} Simbolurile 1, 2, „a” sau „b” apar de două ori 11, 12, 1a, ab, 2b, bb, 22
[a,0]{2,3} Simbolurile „a” sau 0 apar de 2 sau 3 ori aa, a0,00,0a, aaa,000, a00,0a0, a0a

— Încă totul clar.

"Serios? Hmm. Ori am explicat totul foarte bine, fie ești prea rapid la recepție. Ei bine, oricum, asta e bine pentru noi."

„Iată câteva noi perspective pentru tine.”

„Deoarece expresiile regulate sunt adesea folosite pentru a găsi subșiruri, putem adăuga încă două caractere (^ și $) la modelele noastre.”

„^ înseamnă că subșirul trebuie să includă începutul șirului.”

„$ înseamnă că subșirul trebuie să includă sfârșitul șirului.”

"Aici sunt cateva exemple:"

Model Șir și subșiruri care se potrivesc cu modelul
a{3} aaa  aaa   a  aaa _
a{3}$ aaa aaa a  aaa
^a{3} aaa  aaa a aaa
^a{3}$ aaa aaa a aaa

— Și încă un punct important.

„În expresiile regulate, următoarele caractere au o semnificație specială: [ ] \ / ^ $ . | ? * + ( ) { }. Se numesc caractere de control. Deci, nu le puteți folosi pur și simplu în șiruri de caractere."

„Ca și în codul Java, ele trebuie să fie scăpate. „Și din nou, ca și în codul Java, caracterul „\” este folosit pentru asta.”

„Dacă vrem să descriem un șir format din trei „?” caractere, nu putem scrie „?{3}”, deoarece „?” este un caracter de control. Trebuie să facem astfel: \?{3}. Dacă vrem să folosim un caracter „\”, atunci trebuie să scriem „\\”.

"OK am inteles."

„Și acum iată o altă informație interesantă. În fișierele cu cod Java, caracterul „\” trebuie să fie și evadat în șiruri, deoarece este un caracter de control.”

"Desigur."

„Așadar, dacă încercați să definiți o expresie regulată Java într-un șir, atunci trebuie să evadați de două ori caracterul „\”.

„Iată un exemplu:”

Vreau o mască care să se potrivească cu „c:\orice”
În teorie, expresia regulată ar trebui să arate astfel:
un caracter „c”,
două puncte, bară
oblică inversă,
punct și asterisc (pentru a denota orice număr de caractere). Am adăugat spații pentru a îmbunătăți lizibilitatea:
c : \ .*
Dar caracterele „\” și „.” trebuie să fie scapat, deci expresia regulată va arăta astfel:
c :   \\ \. *
Sau, fără spații
c: \\ \. *
"Ar trebui să avem trei bare oblice inverse în expresia noastră regulată.
Asta înseamnă că într-un fișier Java expresia regulată va arăta astfel:"
String regexp = "c: \\\\ \\. *";

"Uau! Uau. Acum știu."

„Și dacă decideți să aprofundați acest lucru, iată câteva link-uri bune:”

Lecție pe Wikipedia