Expresii regulate JavaScript Dincolo de elementele de bază

În tutorialul nostru despre expresiile obișnuite din JavaScript, ați aflat despre utilitatea expresiilor regulate și cum să scrieți câteva dintre dvs. pentru a potrivi modelele simple.

După ce ați citit tutorialul anterior, ar trebui să aveți acum o bună înțelegere a caracterelor speciale, cum ar fi un backslash și secvențe de caractere \ w sau \ W. Iată un rezumat foarte rapid al acestor secvențe de caractere:

  1. Poți să folosești \ d sau \ D pentru a se potrivi cu o cifră sau un caracter non-cifră, respectiv, într-un șir dat. Caracterele numerice includ 0, 1, 2, 3, 4, 5, 6, 7, 8 și 9. Toate celelalte caractere vor fi potrivite de \ D.
  2. Poți să folosești \ w sau \ W pentru a potrivi un cuvânt sau un caracter non-cuvânt în orice șir dat. Caracterele Word includ alfabete, cifre și subliniere. Orice altceva, ca ₹,%, etc., este considerat un caracter non-cuvânt.
  3. Poți să folosești \ s sau \ S pentru a potrivi caracterele spațiului sau caracterele fără spațiu într-un șir. Caracterele spațiului includ spațiu, file, flux de formate și feed de linie.

În loc să potriviți câte un caracter la un moment dat, puteți utiliza funcția * simbol pentru a se potrivi cu expresia precedentă zero sau de mai multe ori. + caracterul se va potrivi în mod similar cu expresia precedentă de 1 sau de mai multe ori.

Puteți să potriviți un model cu un anumit număr de ori adăugând n, m la el. Aici, n este numărul minim de ori pe care doriți să îl potriviți și m este limita maximă. Dacă nu specificați o valoare pentru m, expresia precedentă va fi potrivită de câte ori este posibil.

Ar trebui să verificați tutorialul meu anterior dacă nu este clar nimic din ceea ce am acoperit. Am explicat totul mai detaliat acolo.

Acum, hai să trecem la câteva secvențe de caractere mai sofisticate în expresii regulate, astfel încât să puteți obține cele mai multe din ele și să dați seama cum să scrieți expresii care se potrivesc modelelor complicate.

Meciuri non-greedy folosind ? Caracter

? caracterul înseamnă lucruri diferite în situații diferite.

Când se folosește singur, acest caracter se potrivește cu expresia care a apărut înainte 0 sau de 1 ori. În acest sens, este la fel ca 0,1.

Puteți utiliza, de asemenea ? imediat după alți cuantificatori *, + și pentru a se potrivi cu numărul minim posibil de caractere. Cu alte cuvinte, va transforma acei cuantifiatori lacomi în non-lacomi. Acest lucru poate fi un pic greu de înțeles fără a privi exemplele live, deci să vedem mai întâi un exemplu.

Luați în considerare următoarea frază:

Am fost atribuit 17321HDGE ca id utilizator în timp ce prietenul meu a fost atribuit FHES193EK1.

Acum, să vedem toate meciurile care ar fi fost returnate de către diferiți cuantificatori și contrapartea lor non-lacomi.

Dacă vom folosi expresia / \ D + / g în exemplu, se va potrivi cu unul sau mai multe caractere consecutive. Datorită drapelului global, vor fi trei meciuri: 17321, 193, și 1.

Ar trebui să țineți cont de asta 193 și 1 sunt considerate potriviri diferite deoarece sunt separate prin EK.

Următorul exemplu arată meciurile fără utilizarea unor cuantificatori.

var re = / \ d + / g; numărul var = 0; var textString = "Am primit 17321HDGE ca id utilizator în timp ce prietenul meu a fost atribuit FHES193EK1."; var = re.exec (textString); în timp ce (match = = null) console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Ieșire 17321 193 1 Total meciuri: 3 * /

Acum, adăugând a ? caracter după \ d+ vor reveni nouă meciuri diferite. Pe scurt, / \ D +? / va transforma fiecare caracter numeric într-o potrivire separată. De ce este asta?

Este pentru că \ d+ prin definiție, se presupune că se potrivește cu una sau mai multe cifre. Din moment ce ? caracterul trebuie să corespundă numărului minim posibil de caractere, se potrivește doar cu o singură cifră la un moment dat.

Cei care nu sunt lacomi ? cuantificatorul va reveni la 9 meciuri mai mici cu o singură cifră de data aceasta. Pentru coincidență, am comentat linia care înregistrează meciurile pentru consolă.

var re = / \ d + y / g; numărul var = 0; var textString = "Am primit 17321HDGE ca id utilizator în timp ce prietenul meu a fost atribuit FHES193EK1."; var = re.exec (textString); în timp ce (match = = null) // console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Rezultatele Total meciuri: 9 * /

Să luăm un alt exemplu. Expresia regulată / \ W + / vor păstra caracterele de cuvânt potrivite, atâta timp cât nu sunt întrerupte de un caracter non-cuvânt ca spațiul. În cazul nostru, se vor potrivi cuvinte întregi separate de spațiu alocate și 17321HDGE o dată.

Dacă înlocuim expresia noastră regulată originală / \ W + /, vom obține 14 meciuri diferite. Practic, fiecare cuvânt va fi propriul meci. Puteți observa ieșirea prin comentarea liniei.

var re = / \ w + / g; numărul var = 0; var textString = "Am primit 17321HDGE ca id utilizator în timp ce prietenul meu a fost atribuit FHES193EK1."; var = re.exec (textString); în timp ce (match = = null) // console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Rezultatele meciurilor totale: 14 * /

Acum, schimbarea expresiei către / \ W +? / va returna fiecare personaj de cuvânt ca un meci separat și veți primi 68 de meciuri.

Să aruncăm o privire la un ultim exemplu înainte de a continua. Expresia regulată / \ W 4 / vom returna toate cuvintele din propoziția noastră, care au patru caractere sau mai mult. Așa că se potrivește avea, fost, alocate, și 17321HDGE, printre alții. Acum, transformând-o / \ W 4? / ar întoarce mai multe potriviri din cuvinte cu mai mult de patru caractere. În exemplul nostru, meciurile returnate ar fi avea, fost, Assi, boluri fac, 1732, și 1HGD. Caracterul E la sfârșitul 17321HDGE nu face parte din niciun mecipentru că nu putea fi în grupul a patru personaje consecutive.

var re = / \ w 4, / g; numărul var = 0; var textString = "Am primit 17321HDGE ca id utilizator în timp ce prietenul meu a fost atribuit FHES193EK1."; var = re.exec (textString); în timp ce (match = = null) console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Ieșire au fost alocate 17321HDGE utilizator în timp ce prieten atribuit FHES193EK1 Total meciuri: 9 * /

Folosind Parentheses Cu? Caracter

În tutorialul meu regex anterior, am prezentat pe scurt modul în care parantezele pot fi folosite pentru a-și aminti o parte dintr-un meci. Când este utilizat cu a ? caracter, ele pot servi și altor scopuri.

Uneori, doriți ca un grup de caractere să se potrivească ca o unitate. De exemplu, ați putea căuta evenimentele n / A o dată sau de două ori ca o potrivire în textul următor.

na naa nnaa nana naana

Pentru clarificare, căutați textul cu caractere aldine: n / A n / Aa nn / AA (Nana) n / AAn / A. Partea din paranteze se presupune a fi potrivită ca o unitate, deci este considerată ca un singur meci.

Aproape toți cei care încep doar cu regexul vor folosi expresia / Na 1,2 / cu intenția de a obține rezultatul așteptat. În mintea lor, 1,2 parte se presupune că se potrivește cu una sau două apariții n și A împreună. Cu toate acestea, se potrivește, de fapt, cu un singur eveniment n urmată de 1 sau 2 apariții ale personajului A.

Am redat meciurile returnate / Na 1,2 / cu litere aldine pentru clarificare: n / A NAA nNAA (Na) (na) (NAA) (na). Părțile din paranteze sunt potriviri separate. După cum puteți vedea, nu obținem rezultatul dorit, deoarece 1,2 nu ia în considerare n / A a fi o singură unitate care trebuie să fie potrivită.

Soluția de aici este să utilizați paranteze pentru a indica JavaScript pentru a se potrivi n / A ca unitate. Cu toate acestea, după cum am văzut în tutorialul anterior, JavaScript va începe să reamintească meciul din cauza parantezelor.

Dacă nu doriți JavaScript pentru a vă aminti meciul, atunci va trebui să adăugați ?: înainte de grupul de caractere pe care încercați să le potriviți. În cazul nostru, expresia finală ar deveni / (?: na) 1,2 /. Grupul n / A va fi potrivită ca o unitate acum, și nu va fi amintit. Am subliniat meciurile finale returnate cu această expresie cu caractere aldine: n / A n / Aa nn / AA (nana) n / AAn / A.

Următorul exemplu înregistrează toate potrivirile pentru consolă. Deoarece există 6 meciuri totale, numărul total de meciuri este de 6.

var re = / (a: na) 1,2 / g; numărul var = 0; var textString = "na naa nnaa nana naana"; var = re.exec (textString); în timp ce (match = = null) console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Rezultat na na na nana na na Total meciuri: 6 * /

Lookahead și Lookahead negat

Există multe situații în care căutăm să se potrivească cu un anumit set de caractere, dar numai dacă acestea sunt sau nu sunt urmate de un alt set de caractere. De exemplu, ați putea căuta cuvântul mere într-un text, dar vrea doar acele meciuri care sunt urmate sunteți. Luați în considerare următoarea propoziție.

merele sunt delicioase. Am mâncat mere pe tot parcursul zilei. Toată lumea care a mâncat mere le-a plăcut.

În exemplul de mai sus, dorim doar ca primul cuvânt să fie un meci. Orice altă apariție a cuvântului nu ar trebui să fie în meciuri.

O modalitate de a realiza acest lucru este utilizarea următoarei expresii regulate a (= b). Cuvântul pe care vrem să îl potriviți este A, și cuvântul care va veni după A este b. În cazul nostru, expresia ar deveni / mere (= \ / Sare). Amintiți-vă acest cuvânt sunteți nu este inclus în acest meci.

var re = / mere (? = \ sare) / g; numărul var = 0; var textString = "merele sunt delicioase, am mâncat mere pe tot parcursul zilei, toată lumea care a mâncat mere le-a plăcut"; var = re.exec (textString); în timp ce (match = = null) console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Mere de ieșire Total meciuri: 1 * /

Această expresie regulată, în care ne uităm la ceea ce urmează în șir înainte de a decide dacă cuvântul este un meci, se numește lookahead.

O situație foarte asemănătoare ar apărea dacă ați decis să vă potriviți mere numai dacă a fost nu urmată de un set specific de caractere. În astfel de cazuri, trebuie să înlocuiți ?= cu ?! în expresia obișnuită. Dacă căutam toate aparițiile mere care sunt nu urmat de sunteți, noi vom folosi / mere (?! \ / Sare) ca expresia noastră regulată. Vor fi două meciuri de succes pentru propoziția noastră de testare.

var re = / mere (!! \ sare) / g; numărul var = 0; var textString = "merele sunt delicioase, am mâncat mere pe tot parcursul zilei, toată lumea care a mâncat mere le-a plăcut"; var = re.exec (textString); în timp ce (match = = null) console.log (match [0]); match = re.exec (TextString); conta ++;  console.log ("Total meciuri:" + număr); / * Output mere apples Total meciuri: 2 * /

Încă un lucru - nu trebuie să utilizați două expresii regulate separate pentru a găsi toate potrivirile care sunt urmate de două cuvinte date. Tot ce trebuie să faceți este să adăugați operatorul de țevi între aceste cuvinte și sunteți bine să mergeți. De exemplu, dacă sunteți în căutarea pentru toate aparițiile de mere care sunt urmate de sunteți sau au fost, ar trebui să utilizați / mere (\ sare |?! \ swere) / ca expresie obișnuită.

Gândurile finale

În acest tutorial, am învățat cum să scriem expresii regulate complicate pentru a se potrivi modelelor pe care le căutăm. Putem folosi specialul ? pentru a returna numărul minim necesar al caracterului anterior ca potrivire. În mod similar, putem folosi ? în interiorul parantezelor pentru a vă asigura că grupul pe care l-am comparat nu este amintit. 

În cele din urmă, am aflat că ?= și ?! secvențe de caractere într-o expresie regulată ne oferă posibilitatea de a returna un anumit set de caractere ca o potrivire numai dacă acestea sunt sau nu sunt urmate de un alt set dat de caractere.

Dacă aveți întrebări legate de acest tutorial, nu ezitați să mă anunți și voi face tot posibilul pentru a le explica.

Cod