Învățarea expresiilor regulate

Nu prea înțeleg expresii regulate. Poți să-mi explici asta într-un mod ușor de urmat? Dacă există instrumente sau cărți online, puteți să le trimiteți și la acestea?

0
fr hi bn

1 răspunsuri

Cea mai importantă parte sunt conceptele. Odată ce ați înțeles cum funcționează blocurile de construcție, diferențele în sintaxă reprezintă doar dialecte ușoare. Un strat deasupra sintaxei motorului dvs. de expresie obișnuită este sintaxa limbajului de programare pe care îl utilizați. Limbi precum Perl elimina majoritatea acestei complicații, dar va trebui să țineți cont de alte considerente dacă utilizați expresii regulate într-un program C.

Dacă vă gândiți la expresii regulate ca blocuri de construcție pe care le puteți amesteca și potrivi cum vă place, vă ajută să învățați să scrieți și să depanați propriile tipare, dar și cum să înțelegeți modelele scrise de alții.

Începeți simplu

Conceptual, cele mai simple expresii regulate sunt caractere literale. Modelul N se potrivește cu caracterul "N".

Expresele regulate unul lângă celălalt se potrivesc secvențelor. De exemplu, modelul Nick se potrivește cu secvența "N" urmată de "i" urmată de "c" urmată de "k".

Dacă ați folosit vreodată grep pe Unix? Chiar dacă ați căutat numai șiruri de caractere obișnuite, ați folosit deja expresii regulate! ( re în grep se referă la expresii regulate.)

Comandă din meniu

Dacă adăugați doar o mică complexitate, puteți potrivi fie "Nick", fie "nick" cu modelul [Nn] ick . Partea din parantezele pătrate este o clasă de caractere , ceea ce înseamnă că se potrivește exact cu unul dintre caracterele închise. De asemenea, puteți utiliza intervale în clasele de caractere, astfel încât [a-c] se potrivește cu "a" sau "b" sau "c".

Modelul . este special: mai degrabă decât potrivirea unui punct literal numai, se potrivește cu orice caracter ? . Este același lucru conceptual cu clasa de caractere foarte mare [-.?+%$ A-Za-z0-9 ...] .

Gândiți-vă la clasele de caractere ca la meniuri: alegeți doar una.

Comenzi rapide utile

Utilizarea . vă poate salva o mulțime de tastare și există și alte scurtături pentru modelele comune. Spuneți că doriți să potriviți numerele non-negative: o modalitate de a scrie care este [0-9] + . Cifrele reprezintă o țintă de potrivire frecventă, astfel încât să puteți folosi în schimb codul \ d + pentru a potrivi numerele întregi care nu sunt negative. Altele sunt \ s (spații albe) și \ w (caractere de cuvinte: alfanumerice sau underscore).

Variantele de mai sus sunt complementele acestora, deci \ S se potrivește cu orice caracter non -spațiu spațios, de exemplu.

Odată ce nu este suficient

De acolo, puteți repeta părți ale modelului dvs. cu cuantificatori . De exemplu, modelul ab? C se potrivește cu "abc" sau "ac", deoarece cuantificatorul ? face ca subcapitolul să fie modificat opțional. Sunt și alți cuantificatori

  • * (zero or more times)
  • + (one or more times)
  • {n} (exactly n times)
  • {n,} (at least n times)
  • {n,m} (at least n times but no more than m times)

Punând împreună unele dintre aceste blocuri, modelul [Nn] * ick se potrivește cu toate

  • ick
  • Nick
  • nick
  • Nnick
  • nNick
  • nnick
  • (și așa mai departe)

Primul meci demonstrează o lecție importantă: * întotdeauna reușește! Orice tipar se poate potrivi de zero ori.

Gruparea

Un cuantificator modifică modelul spre stânga imediată. S-ar putea să vă așteptați ca 0abc + 0 să corespundă cu "0abc0", "0abcabc0" ș.amd, dar modelul imediat . Aceasta înseamnă că 0abc + 0 se potrivește cu "0abc0", "0abcc0", "0abccc0" și așa mai departe.

Pentru a potrivi una sau mai multe secvențe de 'abc' cu zerouri la capete, folosiți 0 (abc) +0 . Parantezele denotă un subset care poate fi cuantificat ca o unitate. Este, de asemenea, obișnuit pentru motoarele de expresie regulată să salveze sau să "capteze" partea din textul de intrare care se potrivește cu un grup parantez. Extragerea biților în acest fel este mult mai flexibilă și mai puțin predispusă la erori decât numărarea indiciilor și substr .

Alternanţă

Earlier, we saw one way to match either 'Nick' or 'nick'. Another is with Alternanţă as in Nick|nick. Remember that Alternanţă includes everything to its left and everything to its right. Use Gruparea parentheses to limit the scope of |, e.g., (Nick|nick).

Pentru un alt exemplu, ați putea scrie în mod echivalent [ac] ca a | b | c , dar acest lucru este probabil suboptimal, deoarece multe implementări presupun că alternativele vor avea lungimi mai mari de 1 .

evadarea

Deși unele personaje se potrivesc, altele au înțelesuri speciale. Modelul \ d + nu se potrivește cu spate, urmat de litere mici, urmat de un semn plus: pentru a obține acest lucru, vom folosi \\ d \ + . O reversiune elimină semnificația specială din următorul caracter.

voracitate

Cuantificatorii cu expresie regulată sunt lacomi. Aceasta înseamnă că se potrivesc cât mai mult text posibil, permițând în același timp întregul model să se potrivească cu succes.

De exemplu, spuneți că intrarea este

"Bună ziua", a spus ea, "ce mai faci?"

S-ar putea să vă așteptați ca ". +" să se potrivească numai cu "Bună ziua" și atunci veți fi surprinși atunci când vedeți că se potrivește cu "Hello" tot prin "voi".

Pentru a trece de la lacom la ceea ce ați putea considera prudent, adăugați un extra ? la cuantificatorul. Acum înțelegeți modul \ ((. +?) \) , exemplul din întrebarea dvs. funcționează. Se potrivește cu succesiunea unei paranteze literale stângi, urmată de unul sau mai multe caractere și terminată printr-o paranteză dreaptă.

Dacă intrarea dvs. este "(123) (456)", atunci prima captură va fi "123". Elementele de cuantificare non-lacom vor să permită restul modelului să înceapă să se potrivească cât mai curând posibil.

(În ceea ce privește confuzia dvs., nu știu nici un dialect de expresie regulată unde ((+)) ar face același lucru. Suspectez că ceva sa pierdut în transmisie undeva de-a lungul drumului. )

ancore

Utilizați modelul special ^ pentru a se potrivi numai la începutul intrării dvs. și $ pentru a se potrivi numai la sfârșit. Efectuarea de "agende" cu modelele în care spui "Știu ce se întâmplă în față și înapoi, dar dă-mi totul între" este o tehnică utilă.

Spuneți că doriți să potriviți comentariile din formular

- Acesta este un comentariu -

ați scrie ^ - \ s + (. +) \ s + - $ .

Construiește-ți propriul

Expresiile regulate sunt recursive, deci acum că înțelegeți aceste reguli de bază, le puteți combina oricum doriți.

Instrumente pentru scrierea și depanarea regexelor:

Cărți

Resurse gratuite

Notă de subsol

?: The statement above that . matches any character is a simplification for pedagogical purposes that is not strictly true. Dot matches any character except newline, "\n", but in practice you rarely expect a pattern such as .+ to cross a newline boundary. Perl regexes have a /s switch and Java Pattern.DOTALL, for example, to make . match any character at all. For languages that don't have such a feature, you can use something like [\s\S] to match "any whitespace or any non-whitespace", in other words anything.

0
adăugat
Puteți utiliza, de asemenea, metoda de încercare și de eroare, iar urmarea testelor online și a depanatorului poate fi un ajutor imens: regex101.com
adăugat autor Juraj.Lorinc, sursa
Ar fi foarte important să menționăm că există motoare diferite pentru motoarele de exprimare regulată, cu toate acestea având seturi de seturi de caracteristici diferite și reguli sintactice.
adăugat autor hek2mgl, sursa
Ar fi demn de menționat faptul că, în ciuda unui model similar, a {, m} nu este un lucru, cel puțin în Javascript, Perl și Python.
adăugat autor Nic Hartley, sursa
hackr.io/tutorials/learn-regular-expressions-regex este un mare loc pentru a găsi cele mai bune tutoriale online regex. Toate tutorialele de aici sunt trimise și recomandate de comunitatea de programare.
adăugat autor Saurabh Hooda, sursa