javascript labs expresii regulate. Meciuri și grupe. Caractere din expresiile regulate JavaScript

Expresii obisnuite

Expresie uzuala este un obiect care descrie un model de caracter. Clasa RegExp din JavaScript reprezintă expresii obisnuite, în timp ce obiectele claselor String și RegExp definesc metode care utilizează expresii regulate pentru a efectua operații de potrivire a modelelor și de înlocuire a textului. Gramatica expresiilor regulate în JavaScript conține un subset destul de complet al sintaxei expresiilor regulate folosită în Perl 5, așa că dacă sunteți familiarizat cu Perl, ar trebui să puteți scrie modele în programele JavaScript fără dificultate.

Caracteristicile expresiilor regulate Perl care nu sunt acceptate în ECMAScript includ steagurile s (modul cu o singură linie) și x (sintaxă extinsă); secvențele de evadare \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z și \G și alte constructe extinse care încep cu (?.

Definirea expresiilor regulate

În JavaScript, expresiile regulate sunt reprezentate de obiecte. RegExp. Obiectele RegExp pot fi create folosind constructorul RegExp(), dar mai des sunt create folosind o sintaxă literală specială. Așa cum literalele șir sunt specificate ca caractere cuprinse între ghilimele, literalele expresii regulate sunt specificate ca caractere incluse într-o pereche de bare oblice (/). Astfel, codul JavaScript poate conține linii similare cu aceasta:

Varpattern = /s$/;

Această linie creează un nou obiect RegExp și îl atribuie variabilei de tipar. Acest obiect RegExp caută orice linie care se termină cu „s”. Aceeași expresie regulată poate fi definită folosind constructorul RegExp():

Varpattern = new RegExp("s$");

O specificație de model de expresie regulată constă dintr-o secvență de caractere. Majoritatea personajelor, inclusiv toate caracterele alfanumerice, descriu literalmentele care trebuie să fie prezente. Adică, expresia regulată /java/ se potrivește cu toate șirurile care conțin subșirul „java”.

Alte caractere din expresiile regulate nu sunt destinate să fie căutate după echivalentele lor exacte, dar au o semnificație specială. De exemplu, expresia regulată /s$/ conține două caractere. Primul caracter s denotă o căutare a unui caracter literal. Al doilea, $, este un metacaracter special care marchează sfârșitul unei linii. Deci această expresie regulată se potrivește cu orice șir care se termină cu s.

Următoarele secțiuni descriu diferitele caractere și metacaractere utilizate în expresiile regulate JavaScript.

Simboluri literale

După cum sa menționat mai devreme, toate caracterele alfabetice și numerele din expresiile regulate se potrivesc. Sintaxa expresiei regulate a JavaScript acceptă, de asemenea, capacitatea de a specifica anumite caractere non-alfabetice folosind secvențe de evacuare care încep cu un caracter backslash (\). De exemplu, secvența \n se potrivește cu caracterul newline. Aceste caractere sunt enumerate în tabelul de mai jos:

Unele semne de punctuație au o semnificație specială în expresiile regulate:

^ $ . * + ? = ! : | \ / () { } -

Semnificația acestor simboluri este explicată în secțiunile următoare. Unele dintre ele au o semnificație specială doar în anumite contexte ale expresiilor regulate, în timp ce în alte contexte sunt luate la propriu. Cu toate acestea, în general, pentru a include literalmente oricare dintre aceste caractere într-o expresie obișnuită, trebuie să îl precedați cu un caracter backslash. Alte caractere, cum ar fi ghilimele și @, nu au o semnificație specială și pur și simplu se potrivesc în expresiile regulate.

Dacă nu vă amintiți exact ce caracter ar trebui să fie precedat de un \, puteți pune în siguranță o bară oblică inversă înaintea oricăruia dintre caractere. Cu toate acestea, rețineți că multe litere și numere capătă semnificații speciale împreună cu bara oblică, așa că literele și numerele pe care le căutați literal nu ar trebui să fie precedate de un \. Pentru a include caracterul bară oblică inversă în expresia regulată, evident că trebuie să-l precedați cu un alt caracter bară oblică inversă. De exemplu, următoarea expresie regulată se potrivește cu orice șir care conține un caracter bară oblică inversă: /\\/.

Clasele de caractere

Caracterele literale individuale pot fi combinate în clase de caractere prin includerea lor între paranteze drepte. O clasă de caractere se potrivește cu orice caracter conținut în acea clasă. Prin urmare, expresia regulată // se potrivește cu unul dintre caracterele a, b sau c.

Clasele de caractere negate pot fi, de asemenea, definite, potrivindu-se cu orice caracter, altul decât cele date în paranteze. Clasa de caractere negate este specificată de caracterul ^ ca primul caracter după paranteza din stânga. Expresia regulată /[^abc]/ se potrivește cu orice alt caracter decât a, b sau c. În clasele de caractere, o serie de caractere poate fi specificată cu o cratimă. Toate caracterele latine mici sunt căutate folosind expresia //, iar orice literă sau număr din setul de caractere latine poate fi găsită folosind expresia //.

Anumite clase de caractere sunt utilizate în mod deosebit de frecvent, astfel încât sintaxa expresiilor regulate JavaScript include Simboluri specialeși secvențe de evacuare pentru a le desemna. De exemplu, \s se potrivește cu spații, file și orice caractere de spații albe din setul Unicode, iar \S se potrivește cu orice caractere care nu sunt spații albe din setul Unicode.

Tabelul de mai jos listează aceste caractere speciale și sintaxa claselor de caractere. (Rețineți că unele dintre secvențele de escape ale clasei de caractere se potrivesc numai cu caractere ASCII și nu sunt extinse pentru a funcționa cu caractere Unicode. Puteți defini în mod explicit propriile clase de caractere Unicode, de exemplu /[\u0400-\u04FF]/ se potrivește cu orice caracter chirilic. )

Clase de caractere cu expresii regulate JavaScript
Simbol Conformitate
[...] Oricare dintre personajele dintre paranteze
[^...] Oricare dintre personajele care nu sunt în paranteze
. Orice caracter, altul decât o nouă linie sau alt delimitator de șir Unicode
\w Orice caracter text ASCII. Echivalent
\W Orice caracter care nu este un caracter text ASCII. Echivalent cu [^a-zA-Z0-9_]
\s Orice caracter de spațiu alb din setul Unicode
\S Orice caracter fără spații albe din setul de caractere Unicode. Rețineți că \w și \S nu sunt la fel
\d Orice cifre ASCII. Echivalent
\D Orice caracter, altul decât cifrele ASCII. Echivalent cu [^0-9]
[\b] caracter backspace literal

Rețineți că secvențele de evadare de caractere speciale ale clasei pot fi în paranteza patrata. \s se potrivește cu orice caracter de spațiu alb și \d se potrivește cu orice cifră, deci /[\s\d]/ se potrivește cu orice caracter de spațiu alb sau cifră.

Repetiţie

Cu cunoștințele despre sintaxa expresiilor regulate acumulate până acum, putem descrie un număr din două cifre ca /\d\d/ sau un număr din patru cifre ca /\d\d\d\d/, dar nu putem, de exemplu , descrieți un număr format din orice număr de cifre sau un șir de trei litere urmat de o cifră opțională. Aceste modele mai complexe folosesc sintaxa expresiei regulate pentru a specifica de câte ori se poate repeta. element dat expresie uzuala.

Simbolurile care denotă repetiția urmează întotdeauna modelul la care se aplică. Unele tipuri de repetări sunt folosite destul de des și există simboluri speciale pentru aceste cazuri. De exemplu, + se potrivește cu una sau mai multe instanțe ale modelului anterior. Următorul tabel este un rezumat al sintaxei de repetiție:

Următoarele rânduri prezintă câteva exemple:

Varpattern = /\d(2,4)/; // Potrivește un număr care conține modelul de două până la patru cifre = /\w(3)\d?/; // Potrivește exact trei caractere de cuvinte și un model de cifre opțional = /\s+java\s+/; // Potrivește cuvântul „java” cu unul sau mai multe spații // înainte și după model = /[^(]*/; // Potrivește zero sau mai multe caractere, altele decât paranteza de deschidere

Aveți grijă când utilizați caracterele repetate * și ?. Se pot potrivi cu absența unui model precedat de ele și, prin urmare, cu absența caracterelor. De exemplu, expresia regulată /a*/ se potrivește cu șirul „bbbb” deoarece nu conține caracterul a.

Caracterele de repetiție enumerate în tabel corespund numărului maxim posibil de repetări, ceea ce asigură căutarea părților ulterioare ale expresiei regulate. Spunem că aceasta este o repetiție „lacomă”. De asemenea, este posibil să implementați repetarea într-un mod „non-lacom”. Este suficient să specificați un semn de întrebare după caracterul (sau caracterele) de repetare: ??, +?, *? sau chiar (1,5)?.

De exemplu, expresia regulată /a+/ se potrivește cu una sau mai multe instanțe ale literei a. Aplicat șirului „aaa”, se potrivește cu toate cele trei litere. Pe de altă parte, expresia /a+?/ se potrivește cu una sau mai multe instanțe ale literei a și selectează cel mai puțin posibil număr de caractere. Aplicat aceluiași șir, acest model se potrivește doar cu prima literă a.

Repetarea „non-lacomă” nu dă întotdeauna rezultatul așteptat. Luați în considerare modelul /a+b/ care se potrivește cu unul sau mai multe a urmate de un b. Pentru șirul „aaab”, se potrivește întregului șir.

Acum să verificăm versiunea „non-lacomă” a /a+?b/. S-ar putea crede că ar trebui să se potrivească cu un b precedat doar de unul a. Dacă se aplică aceluiași șir, „aaab” ar fi de așteptat să se potrivească cu un singur a și ultimul b. Cu toate acestea, de fapt, întregul șir se potrivește cu acest model, ca și în cazul versiunii „lacom”. Acest lucru se datorează faptului că căutarea modelului de expresii regulate este efectuată prin găsirea primei poziții din șir din care devine posibilă o potrivire. Deoarece o potrivire este posibilă începând de la primul caracter al șirului, potrivirile mai scurte începând de la caracterele ulterioare nici măcar nu sunt luate în considerare.

Alternative, grupări și link-uri

Gramatica expresiilor regulate include caractere speciale pentru definirea alternativelor, gruparea subexpresiilor și referințe la subexpresiile anterioare. Simbol bară verticală | servește la separarea alternativelor. De exemplu, /ab|cd|ef/ se potrivește fie cu șirul „ab”, fie cu șirul „cd”, fie cu șirul „ef”, iar modelul /\d(3)|(4)/ se potrivește fie cu trei cifre, fie cu patru litere mici litere .

Rețineți că alternativele sunt procesate de la stânga la dreapta până când este găsită o potrivire. Dacă se găsește o potrivire cu alternativa din stânga, alternativa dreaptă este ignorată, chiar dacă se poate obține o potrivire „mai bună”. Deci, atunci când /a|ab/ este aplicat șirului „ab”, acesta se va potrivi doar cu primul caracter.

Parantezele au semnificații multiple în expresiile regulate. Una dintre ele este gruparea elementelor individuale într-o singură subexpresie, astfel încât elementele atunci când se folosesc caracterele speciale |, *, +, ? iar altele sunt tratate ca una. De exemplu, modelul /java(script)?/ se potrivește cu cuvântul „java” urmat de cuvântul opțional „script”, iar /(ab|cd)+|ef)/ se potrivește fie cu șirul „ef”, fie cu unul sau mai multe repetări ale unuia din șirurile „ab” sau „cd”.

O altă utilizare a parantezelor în expresiile regulate este definirea subpatternelor într-un model. Când se găsește o potrivire a expresiei regulate în șirul țintă, poate fi extrasă partea din șirul țintă care se potrivește cu un anumit submodel între paranteze.

Să presupunem că doriți să găsiți una sau mai multe litere mici urmate de unul sau mai multe numere. Puteți utiliza modelul /+\d+/ pentru aceasta. Dar să presupunem, de asemenea, că vrem doar numerele de la sfârșitul fiecărui meci. Dacă plasăm această parte a modelului între paranteze (/+(\d+)/), atunci putem extrage numere din orice potrivire pe care le găsim. Cum se face acest lucru va fi descris mai jos.

Legat de aceasta este o altă utilizare a subexpresiilor între paranteze pentru a se referi la subexpresii din partea anterioară a aceleiași expresii regulate. Acest lucru se realizează prin specificarea uneia sau mai multor cifre după caracterul \. Numerele se referă la poziția subexpresiei între paranteze în cadrul expresiei regulate. De exemplu, \1 se referă la prima subexpresie, iar \3 se referă la a treia. Rețineți că subexpresiile pot fi imbricate, astfel încât poziția parantezei din stânga este utilizată în numărare. De exemplu, în următoarea expresie regulată, referința la subexpresia imbricată (script) va arăta ca \2:

/(ava(script)?)\sis\s(fun\w*)/

Referirea la subexpresia anterioară nu indică șablonul acestei subexpresii, ci textul găsit care se potrivește cu acest șablon. Prin urmare, referințele pot fi folosite pentru a impune o constrângere care selectează părți dintr-un șir care conțin exact aceleași caractere. De exemplu, următoarea expresie regulată se potrivește cu zero sau mai multe caractere între ghilimele simple sau duble. Cu toate acestea, nu necesită ca ghilimelele de deschidere și de închidere să se potrivească (adică ambele ghilimele să fie simple sau duble):

/[""][^""]*[""]/

Putem solicita oferte care să se potrivească cu această referință:

Aici \1 se potrivește cu prima potrivire a subexpresiei. În acest exemplu, legătura impune o constrângere care necesită ca citatul de închidere să se potrivească cu citatul de deschidere. Această expresie regulată nu permite prezența ghilimele simpleîn interiorul dublelor și invers.

De asemenea, este posibil să grupați elemente într-o expresie regulată fără a crea o referință numerotată la acele elemente. În loc să grupați pur și simplu elemente între (și), începeți grupul cu caractere (?: și terminați-l cu un caracter). Luați în considerare, de exemplu, următorul model:

/(ava(?:script)?)\sis\s(fun\w*)/

Aici subexpresia (?:script) este necesară doar pentru grupare, astfel încât caracterul de repetiție ? poate fi aplicat grupului. Aceste paranteze modificate nu creează o legătură, așa că \2 în această expresie regulată se referă la text care se potrivește cu modelul (distracție\w*).

Următorul tabel listează operatorii de selectare din alternative, de grupare și de referință în expresiile regulate:

Caracterele cu expresii regulate selectează dintre alternative, grupări și linkuri JavaScript
Simbol Sens
| Alternativă. Se potrivește fie cu subexpresia din stânga, fie cu subexpresia din dreapta.
(...) Gruparea. Grupează elemente într-o singură entitate care poate fi folosită cu *, +, ?, | etc. De asemenea, își amintește caracterele corespunzătoare acestui grup pentru a fi folosite în link-urile ulterioare.
(?:...) Numai gruparea. Grupează elemente împreună, dar nu își amintește caracterele corespunzătoare acestui grup.
\număr Se potrivește cu aceleași caractere care au fost găsite atunci când sunt comparate cu numărul de număr al grupului. Grupurile sunt subexpresii între paranteze (posibil imbricate). Numerele grupurilor sunt atribuite prin numărarea parantezelor din stânga de la stânga la dreapta. Grupurile formate cu caractere (?:) nu sunt numerotate.

Specificarea unei poziții de potrivire

După cum s-a descris mai devreme, multe elemente ale unei expresii regulate se potrivesc cu un singur caracter dintr-un șir. De exemplu, \s se potrivește cu un caracter de spațiu alb. Alte elemente ale expresiilor regulate potrivesc pozițiile dintre caractere, nu caracterele în sine. De exemplu, \b se potrivește cu o limită de cuvânt - o limită între \w (un caracter text ASCII) și \W (un caracter non-text), sau o limită între un caracter text ASCII și începutul sau sfârșitul unei linii.

Elemente precum \b nu definesc niciun caracter care trebuie să fie prezent în șirul potrivit, dar definesc poziții valide pentru potrivire. Aceste elemente sunt uneori numite elemente de ancorare a expresiei regulate, deoarece ancorează modelul într-o anumită poziție din șir. Mai des decât altele, sunt folosite elemente de ancorare, cum ar fi ^ și $, care ancorează modele la începutul și, respectiv, la sfârșitul liniei.

De exemplu, cuvântul „JavaScript” de pe o linie proprie poate fi asociat cu expresia regulată /^JavaScript$/. Pentru a găsi un singur cuvânt „Java” (mai degrabă decât un prefix, de exemplu în cuvântul „JavaScript”), puteți încerca să utilizați modelul /\sJava\s/, care necesită un spațiu înainte și după cuvânt.

Dar această soluție ridică două probleme. În primul rând, va găsi cuvântul „Java” doar dacă este înconjurat de spații pe ambele părți și nu îl va găsi la începutul sau la sfârșitul șirului. În al doilea rând, atunci când acest model se potrivește, șirul pe care îl returnează va conține spații de început și de final, ceea ce nu este exact ceea ce ne dorim. Deci, în loc de un model care se potrivește cu caracterele de spațiu alb \s, vom folosi un model (sau ancora) care se potrivește cu granițele cuvintelor \b. Se va obține următoarea expresie: /\bJava\b/.

Elementul ancora \B se potrivește cu o poziție care nu este o limită de cuvânt. Adică, modelul /\Bscript/ se va potrivi cu cuvintele „JavaScript” și „postscript” și nu se va potrivi cu cuvintele „script” sau „Scripting”.

Expresiile regulate arbitrare pot acționa și ca condiții de ancorare. Punerea unei expresii între caractere (?= și) o transformă într-o potrivire anticipată pentru caracterele ulterioare, solicitând ca acele caractere să se potrivească cu modelul specificat, dar nu sunt incluse în șirul de potrivire.

De exemplu, pentru a potrivi numele unui limbaj de programare comun urmat de două puncte, puteți utiliza expresia /ava(script)?(?=\:)/. Acest model se potrivește cu cuvântul „JavaScript” din șirul „JavaScript: The Definitive Guide”, dar nu se va potrivi cu cuvântul „Java” din șirul „Java pe scurt”, deoarece nu este urmat de două puncte.

Dacă introduceți condiția (?!, atunci va fi un test de anticipare negativă pentru caracterele ulterioare, necesitând ca următoarele caractere să nu se potrivească cu modelul specificat. De exemplu, modelul /Java(?!Script)(\w *)/ se potrivește cu subșirul „Java”, urmat de o literă mare și orice număr de caractere text ASCII, cu condiția ca subșirul „Java” să nu fie urmat de subșirul „Script” Se potrivește cu șirul „JavaBeans”, dar nu se potrivește șirul „Javanese”, se potrivește cu șirul „JavaScrip „, dar nu se va potrivi cu șirurile „JavaScript” sau „JavaScripter”.

Tabelul de mai jos listează caracterele ancora în expresiile regulate:

Ancore de expresie regulată
Simbol Sens
^ Se potrivește la începutul unei expresii șir sau începutul unui șir într-o căutare pe mai multe linii.
$ Se potrivește la sfârșitul unei expresii șir sau la sfârșitul unui șir într-o căutare pe mai multe linii.
\b Se potrivește cu o limită de cuvânt, de ex. se potrivește poziția dintre caracterul \w și caracterul \W sau dintre caracterul \w și începutul sau sfârșitul șirului. (Totuși, rețineți că [\b] se potrivește cu un caracter backspace.)
\B Se potrivește cu o poziție care nu este o limită de cuvânt.
(?=p) Verificare anticipată pozitivă pentru caracterele ulterioare. Necesită caractere ulterioare pentru a se potrivi cu modelul p, dar nu include acele caractere în șirul găsit.
(?!p) Verificare anticipată negativă pentru caracterele ulterioare. Necesită ca următoarele caractere să nu se potrivească cu modelul p.

Steaguri

Și un ultim element al gramaticii expresiilor regulate. Indicatorii de expresie regulată definesc regulile de potrivire a modelelor de nivel înalt. Spre deosebire de restul gramaticii expresiilor regulate, steagurile nu sunt specificate între caracterele slash, ci după al doilea. Limbajul JavaScript acceptă trei steaguri.

steag i specifică că căutarea modelului ar trebui să nu țină seama de majuscule și minuscule și g steag- că căutarea trebuie să fie globală, i.e. trebuie găsite toate potrivirile din șir. steag m efectuează o căutare de model în modul multilinie. Dacă expresia șir căutată conține linii noi, atunci, în acest mod, caracterele ancora ^ și $, pe lângă potrivirea începutului și sfârșitului întregii expresii șirului, se potrivesc și la începutul și sfârșitul fiecărei șir de text. De exemplu, modelul /java$/im se potrivește atât cu „java” cât și cu „Java\nis fun”.

Aceste steaguri pot fi combinate în orice combinație. De exemplu, pentru a căuta prima apariție a cuvântului „java” (sau „Java”, „JAVA”, etc.) fără a ține seama de majuscule și minuscule, puteți utiliza expresia regulată care nu ține seama de majuscule și minuscule /\bjava\b/ i. Și pentru a găsi toate aparițiile acestui cuvânt într-un șir, puteți adăuga steag g: /\bjava\b/gi.

Metode de clasă șiruri pentru potrivirea modelelor

Până în acest moment, am discutat despre gramatica expresiilor regulate generate, dar nu ne-am uitat la modul în care aceste expresii regulate pot fi de fapt utilizate în scripturile JavaScript. LA aceasta sectiune vom discuta despre metodele de pe obiectul String care folosesc expresii regulate pentru potrivirea modelelor, precum și pentru căutare și înlocuire. Și apoi vom continua să vorbim despre potrivirea modelelor cu expresii regulate, analizând obiectul RegExp, metodele și proprietățile acestuia.

Șirurile acceptă patru metode folosind expresii regulate. Cea mai simplă dintre acestea este metoda căutare(). Ia o expresie regulată ca argument și returnează fie poziția primului caracter al subșirului găsit, fie -1 dacă nu se găsește nicio potrivire. De exemplu, următorul apel va returna 4:

Varresult = "JavaScript".search(/script/i); // patru

Dacă argumentul metodei search() nu este o expresie regulată, este mai întâi convertit prin trecerea acestuia către constructorul RegExp. metoda search() nu acceptă căutare globalăși ignoră steag-ul g în argumentul său.

Metodă a inlocui() efectuează o operație de căutare și înlocuire. Ia o expresie regulată ca prim argument și un șir de înlocuire ca al doilea. Metoda caută șirul pentru care este apelată pentru a se potrivi cu modelul specificat.

Dacă expresia regulată conține indicatorul g, metoda replace() înlocuiește toate potrivirile găsite cu șirul de înlocuire. LA in caz contrarînlocuiește doar primul meci pe care îl găsește. Dacă primul argument al metodei replace() este un șir și nu o expresie regulată, atunci metoda efectuează o căutare literală a șirului, mai degrabă decât să-l convertească într-o expresie regulată folosind constructorul RegExp(), ca search() metoda face.

Ca exemplu, putem folosi metoda replace() pentru a plasa uniform litere mariîn cuvântul „JavaScript” pentru întreaga linie de text:

// Indiferent de cazul caracterelor, înlocuim cuvântul în cazul dorit var result = "javascript".replace(/JavaScript/ig, "JavaScript");

Metoda replace() este mai mult Unealtă puternică decât s-ar putea aștepta din acest exemplu. Amintiți-vă că subexpresiile între paranteze dintr-o expresie regulată sunt numerotate de la stânga la dreapta și că expresia regulată își amintește textul care se potrivește cu fiecare dintre subexpresii. Dacă șirul de înlocuire conține un semn $ urmat de un număr, metoda replace() înlocuiește acele două caractere cu textul care se potrivește cu subexpresia specificată. Aceasta este o caracteristică foarte utilă. Îl putem folosi, de exemplu, pentru a înlocui ghilimele drepte dintr-un șir cu ghilimele tipografice care imită caracterele ASCII:

// Un citat este un citat urmat de orice număr de caractere // altele decât ghilimele (le amintim), aceste caractere // sunt urmate de un alt citat var citat = /"([^"]*)"/g; / / Înlocuiți ghilimele drepte cu ghilimele tipografice și lăsați „$1” neschimbat // Citați conținutul stocat în $1 var text = „„JavaScript” este un limbaj de programare interpretat.”; var result = text.replace(quote, „”$1””) ; // „JavaScript” este un limbaj de programare interpretat.

Un lucru important de remarcat este că al doilea argument pentru înlocuire() poate fi o funcție care calculează dinamic șirul de înlocuire.

Metodă Meci() este cea mai comună metodă clasa String folosind expresii regulate. Acesta ia o expresie regulată ca singur argument (sau își convertește argumentul într-o expresie regulată pasând-o la constructorul RegExp()) și returnează o matrice care conține rezultatele căutării. Dacă indicatorul g este setat în expresia regulată, metoda returnează o matrice cu toate potrivirile prezente în șir. De exemplu:

// returnează ["1", "2", "3"] var rezultat = "1 plus 2 este egal cu 3".match(/\d+/g);

Dacă expresia regulată nu conține indicatorul g, metoda match() nu efectuează o căutare globală; caută doar primul meci. Totuși, match() returnează o matrice chiar și atunci când metoda nu efectuează o căutare globală. În acest caz, primul element al tabloului este subșirul găsit, iar toate elementele rămase sunt subexpresii ale expresiei regulate. Prin urmare, dacă match() returnează o matrice arr, atunci arr va conține întregul șir găsit, arr subșirul corespunzător primei subexpresii și așa mai departe. Făcând o paralelă cu metoda replace(), putem spune că arr[n] este umplut cu conținutul lui $n.

De exemplu, aruncați o privire la următoarele cod de programare, care analizează adresa URL:

Var url = /(\w+):\/\/([\w.]+)\/(\S*)/; var text = "Vizitați site-ul nostru http://www..php"; var rezultat = potrivire text(url); if (rezultat != null) ( var fullurl = rezultat; // Conține „http://www..php” var protocol = rezultat; // Conține „http” var gazdă = rezultat; // Conține „www..php” ")

Rețineți că pentru o expresie regulată care nu are setat indicatorul de căutare globală g, metoda match() returnează aceeași valoare ca metoda exec() a expresiei regulate: tabloul returnat are proprietăți de index și de intrare, așa cum este descris în discuția despre exec( ) de mai jos.

Ultima metodă a obiectului String care utilizează expresii regulate este Despică(). Această metodă împarte șirul pe care este apelat într-o matrice de subșiruri, folosind argumentul ca delimitator. De exemplu:

"123.456.789".split(","); // Returnează ["123","456","789"]

Metoda split() poate lua, de asemenea, o expresie regulată ca argument. Acest lucru face metoda mai puternică. De exemplu, puteți specifica un separator care permite un număr arbitrar caractere cu spații albe pe ambele părți:

„1, 2, 3 , 4 , 5”.split(/\s*,\s*/); // Returnează ["1","2","3","4","5"]

obiect Regexp

După cum sa menționat, expresiile regulate sunt reprezentate ca obiecte RegExp. În plus față de constructorul RegExp(), obiectele RegExp acceptă trei metode și mai multe proprietăți.

Constructorul RegExp() preia unul sau două argumente șir și creează un nou obiect RegExp. Primul argument al constructorului este un șir care conține corpul expresiei regulate, i.e. textul care trebuie să apară între barele oblice în expresia regulată literal. Rețineți că literalele șirurile și expresiile regulate folosesc caracterul \ pentru a desemna secvențele de escape, așa că atunci când treceți o expresie regulată ca literal șir către constructorul RegExp(), trebuie să înlocuiți fiecare caracter \ cu o pereche de caractere \\.

Al doilea argument pentru RegExp() poate lipsi. Dacă este specificat, specifică steagurile expresiei regulate. Trebuie să fie unul dintre caracterele g, i, m sau o combinație a acestor caractere. De exemplu:

// Găsește toate numerele cu cinci cifre dintr-un șir. Notă // utilizarea caracterelor \\ în acest exemplu var zipcode = new RegExp("\\d(5)", "g");

Constructorul RegExp() este util atunci când o expresie regulată este generată dinamic și, prin urmare, nu poate fi reprezentată folosind sintaxa literală a expresiei regulate. De exemplu, pentru a găsi un șir introdus de utilizator, trebuie să creați o expresie regulată în timpul execuției folosind RegExp().

Proprietăți regexp

Fiecare obiect RegExp are cinci proprietăți. Proprietate sursă- un șir numai pentru citire care conține textul expresiei regulate. Proprietate global este o valoare booleană numai pentru citire care specifică prezența steagului g în expresia regulată. Proprietate ignoreCase este un boolean numai pentru citire care specifică dacă steag-ul i este prezent în expresia regulată. Proprietate multilinie este un boolean numai pentru citire care specifică dacă indicatorul m este prezent în expresia regulată. Și ultima proprietate ultimulIndex este un număr întreg de citire/scriere. Pentru modelele cu steag g, această proprietate conține numărul poziției din linia la care se află următoarea căutare. După cum este descris mai jos, este folosit de metodele exec() și test().

Metode RegExp

Obiectele RegExp definesc două metode care efectuează potrivirea modelelor; ele se comportă similar cu metodele clasei String descrise mai sus. Metoda principală a clasei RegExp utilizată pentru potrivirea modelelor este exec(). Este similară cu metoda match() a clasei String menționată, cu excepția faptului că este o metodă a clasei RegExp care ia un șir ca argument, mai degrabă decât o metodă a clasei String care ia un argument RegExp.

Metoda exec() execută expresia regulată pentru șirul specificat, adică. caută o potrivire într-un șir. Dacă nu se găsește nicio potrivire, metoda returnează null. Totuși, dacă se găsește o potrivire, returnează aceeași matrice ca și matricea returnată de metoda match() pentru căutarea fără indicatorul g. Element zero matricea conține șirul care se potrivește cu expresia regulată, iar toate elementele ulterioare sunt subșiruri care se potrivesc cu toate subexpresiile. În plus, proprietatea index conține numărul de poziție al caracterului cu care începe fragmentul corespunzător și proprietatea intrare se referă la șirul căutat.

Spre deosebire de match(), metoda exec() returnează o matrice a cărei structură nu depinde de prezența steagului g în expresia regulată. Permiteți-mi să vă reamintesc că atunci când treceți o expresie regulată globală, metoda match() returnează o serie de potriviri găsite. Și exec() returnează întotdeauna o potrivire, dar oferă despre aceasta informatii complete. Când exec() este apelat pe o expresie regulată care conține indicatorul g, metoda setează proprietatea lastIndex a obiectului expresie regulată la numărul de poziție al caracterului imediat după subșirul potrivit.

Când metoda exec() este apelată pentru aceeași expresie regulată a doua oară, începe căutarea la poziția caracterului specificată în proprietatea lastIndex. Dacă exec() nu găsește o potrivire, proprietatea lastIndex este setată la 0. (De asemenea, puteți seta lastIndex la zero în orice moment, ceea ce ar trebui să faceți în toate cazurile în care căutarea se termină înainte ca ultima potrivire dintr-o linie să fie găsită , iar căutarea începe pe un alt șir cu același obiect RegExp.) Acest comportament special vă permite să apelați în mod repetat exec() pentru a repeta peste toate potrivirile expresiei regulate din șir. De exemplu:

Varpattern = /Java/g; var text = "JavaScript este mai mult lucru amuzant decât Java!"; var rezultat; while((rezultat = pattern.exec(text)) != null) ( console.log("Găsit "" + rezultat + """ + " la poziția " + result.index + " ; următoarea căutare va începe la " + pattern.lastIndex); )

O altă metodă a obiectului RegExp - Test(), ceea ce este mult metoda mai usoara exec(). Ia un șir și returnează adevărat dacă șirul se potrivește cu expresia regulată:

Varpattern = /java/i; pattern.test("JavaScript"); // Returnează adevărat

Apelarea test() este echivalentă cu apelarea exec() returnând true dacă exec() returnează non-null. Din acest motiv, metoda test() se comportă în același mod ca metoda exec() atunci când este apelată pe o expresie regulată globală: începe căutarea șirului specificat la poziția specificată de proprietatea lastIndex și dacă găsește o potrivire , setează proprietatea lastIndex la numărul poziției caracterului direct după potrivirea găsită. Prin urmare, folosind metoda test(), puteți forma și o buclă de traversare a șirurilor, ca folosind metoda exec().

Sintaxa expresiilor regulate este destul de complexă și necesită un efort serios pentru a învăța. Cel mai bun ghid al expresiilor regulate astăzi este Expresiile regulate ale lui J. Friedl, care, în cuvintele autorului, „învață să gândească în termeni de expresii regulate”.

Noțiuni de bază

Expresie uzuala- un instrument de procesare a șirurilor de caractere sau a unei secvențe de caractere care definește un șablon de text.

Modificator- este pentru „instruirea” unei expresii regulate.

Metacaracterele- caractere speciale care servesc drept comenzi ale limbajului expresiei regulate.

Expresia regulată este setată ca o variabilă regulată, se folosește doar o bară oblică în loc de ghilimele, de exemplu: var reg=/regexp/

Sub cele mai simple șabloane, ne referim la acele șabloane care nu au nevoie de caractere speciale.

Să presupunem că sarcina noastră este să înlocuim toate literele „r” (mic și majuscule) cu latină majusculă„R” într-o frază Expresii obisnuite.

Creați un șablon var reg=/p/și folosind metoda a inlocui ne ducem la îndeplinire planurile

Ca rezultat, obținem linia - Expresii obisnuite, înlocuirea s-a produs doar la prima apariție a literei „r”, distinge între majuscule și minuscule.

Dar acest rezultat nu se potrivește condițiilor problemei noastre... Aici avem nevoie modificatori„g” și „i”, care pot fi folosite separat sau împreună. Acești modificatori sunt plasați la sfârșitul modelului de expresie regulată, după bară oblică și au următoarele semnificații:

modificator„g” - setează căutarea în șir ca „global”, adică în cazul nostru, înlocuirea va avea loc pentru toate aparițiile literei „p”. Acum șablonul arată astfel: var reg=/p/g, înlocuindu-l în codul nostru

ia șirul - Expresii obisnuite.

modificatorul „i”.- setează căutarea în șir fără majuscule și minuscule prin adăugarea acestui modificator la șablonul nostru var reg=/p/gi, după executarea scriptului, vom obține rezultatul dorit al sarcinii noastre - Expresii obisnuite.

Caractere speciale (metacaractere)

Metacaracterele specifică tipul de caractere ale șirului de căutare, modul în care șirul de căutare este înconjurat în text, precum și numărul de caractere. tip separatîn textul care este vizualizat. Prin urmare, metacaracterele pot fi împărțite în trei grupuri:

  • Potrivirea metacaracterelor.
  • Metacaracterele cantitative.
  • Poziționarea metacaracterelor.

Potrivirea metacaracterelor

Sens

Descriere

limita de cuvinte

specifică condiția în care modelul trebuie executat la începutul sau la sfârșitul unui cuvânt

/\ber/ coincide cu eroare, nu se potrivește cu erou sau cu jucător
/er/ coincide cu jucător, nu se potrivește cu erou sau cu eroare
/\ber\b/ nu se potriveste cu erou sau cu jucător sau cu eroare, poate doar să se potrivească er

nu o limită de cuvânt

specifică o condiție în care modelul nu este executat la începutul sau la sfârșitul unui cuvânt

/\ber/ coincide cu erou sau cu jucător, nu se potrivește cu eroare
/er\B/ coincide cu eroare sau cu jucător, nu se potrivește cu erou
/\Ber\B/ coincide cu erou, nu se potrivește cu jucător sau cu eroare

cifra de la 0 la 9

/\d\d\d\d/ se potrivește cu orice număr de patru cifre

/\D\D\D\D/ nu se potriveste cu 2005 sau 05.g sau №126 etc.

un singur caracter gol

se potrivește cu un caracter de spațiu

\peste\sbyte\ se potriveste numai cu peste octet

un singur caracter nevid

orice caracter, cu excepția spațiului

\over\Sbyte\ coincide cu peste octet sau cu peste_octeți, nu se potrivește cu peste octet sau peste--octet

literă, număr sau liniuță

/A\w/ coincide cu A1 sau cu AB, nu se potrivește cu A+

nu o literă, un număr sau o liniuță de subliniere

/A\W/ nu se potriveste cu A1 sau cu AB, coincide cu A+

orice personaj

orice semne, litere, cifre etc.

/.../ se potrivește cu oricare trei caractere ABC sau [email protected] sau 1 q

set de caractere

specifică o condiție în care modelul trebuie să fie executat pentru orice potrivire a caracterelor cuprinse între paranteze drepte

/WERTY/ coincide cu qwerty, Cu AWERTY

set de caractere care nu primesc

specifică o condiție în care modelul nu ar trebui să fie executat pentru nicio potrivire a caracterelor cuprinse între paranteze drepte

/[^QA]WERTY/ nu se potriveste cu qwerty, Cu AWERTY

Caracterele afișate în tabelul „Metacaractere pentru potrivire” nu trebuie confundate cu secvența de caractere de escape utilizate în șiruri, cum ar fi \\t - tab, \\n - break to linie nouă etc.

Metacaracterele cantitative

Numărul de coincidențe

De zero sau de mai multe ori

/Ja*script/ coincide cu JavaScript sau cu JavaScript sau cu JavaScript, nu se potrivește cu jovascript

Zero sau o dată

/javascript/ se potriveste numai cu JavaScript sau cu JavaScript

Una sau mai multe ori

/javascript/ coincide cu JavaScript sau cu JavaScript sau cu JavaScript, nu se potrivește cu JavaScript

exact de n ori

/Ja(2)script/ se potriveste numai cu JavaScript

de n sau de mai multe ori

/Ja(2,)script/ coincide cu JavaScript sau cu JavaScript, nu se potrivește cu JavaScript sau cu JavaScript

pe macar, de n ori, dar nu mai mult de m ori

/Ja(2,3)script/ se potriveste numai cu JavaScript sau cu JavaScript

Fiecare caracter listat în tabelul Metacaractere cantitative se aplică caracterului sau metacaracterului precedent din expresia regulată.

Poziționarea metacaracterelor

Ultimul set de metacaractere este destinat să indice unde să căutați (dacă contează) un subșir la începutul sau la sfârșitul șirului.

Câteva metode de lucru cu șabloane

a inlocui - aceasta metoda l-am folosit deja la începutul articolului, este conceput pentru a căuta un eșantion și pentru a înlocui subșirul găsit cu un subșir nou.

exec- această metodă realizează potrivirea șirurilor cu modelul dat de model. Dacă potrivirea modelului eșuează, reveniți nul. În caz contrar, rezultatul este o matrice de subșiruri care se potrivesc cu modelul dat. /*Primul element al tabloului va fi egal cu șirul original care satisface modelul dat*/

de exemplu:

ca rezultat, obținem patru linii:
Data nasterii: 15.09.1980
Ziua de naștere: 15
Luna nasterii: 09
Anul nașterii: 1980

Concluzie

Articolul nu arată toate caracteristicile și farmecele expresiilor obișnuite, pentru un studiu mai profund al acestei probleme, vă sfătuiesc să studiați obiectul RegExp. De asemenea, vreau să atrag atenția asupra faptului că sintaxa expresiilor regulate nu este diferită atât în ​​JavaScript, cât și în PHP. De exemplu, pentru a verifica corectitudinea introducerii unui e-mail, o expresie regulată, ce pentru JavaScript, ce pentru PHP va arăta la fel /[email protected]+.(2,3)/i.

JavaScript regexp este un tip de obiect care este folosit pentru a potrivi o secvență de caractere în șiruri.

Crearea primei expresii regulate

Există două moduri de a crea o expresie regulată: folosind o expresie regulată literală sau folosind constructorul expresiei regulate. Fiecare reprezintă același model: personajul " c' urmată de ' A' urmat de simbolul ' t».

// literal expresie regulată închisă în bare oblice (/)
var opțiune1 = /cat/;
// Constructor de expresii regulate
var option2 = new RegExp("cat");

Ca regulă generală, dacă o expresie regulată rămâne constantă, adică nu se va schimba, este mai bine să folosiți o expresie regulată literală. Dacă se va schimba sau depinde de alte variabile, este mai bine să folosiți o metodă cu un constructor.

Metoda RegExp.prototype.test().

Îți amintești când am spus că expresiile regulate sunt obiecte? Aceasta înseamnă că au o gamă largă de metode. Cea mai ușoară metodă este JavaScript test regexp, care returnează un boolean:

Adevărat (adevărat): șirul conține modelul expresiei regulate.

Fals (fals): nu s-a găsit nicio potrivire.

console.log(/cat/.test(„pisica spune miau”);
// dreapta
console.log(/cat/.test(„câinele spune că latră”));
// gresit

Memento de bază despre expresia regulată

Secretul expresiilor regulate este să vă amintiți caracterele și grupurile comune. Vă recomand cu căldură să petreceți câteva ore pe tabelul de mai jos și apoi să vă întoarceți și să vă continuați studiul.

Simboluri

  • . – (punct ) se potrivește cu orice caracter, cu excepția unei întreruperi de linie;
  • *  –  se potrivește cu expresia anterioară care se repetă de 0 sau de mai multe ori;
  • +  –  se potrivește cu expresia anterioară care se repetă de 1 sau de mai multe ori;
  • ? –  expresia anterioară este opțională ( se potrivește de 0 sau 1 ori);
  • ^ - se potrivește cu începutul liniei;
  • $ - Se potrivește cu sfârșitul șirului.

Grupuri de caractere

  • d–  se potrivește cu orice caracter numeric.
  • w–  se potrivește cu orice caracter (număr, literă sau liniuță de subliniere).
  • [XYZ]- set de caractere. Se potrivește cu orice caracter din setul dat în paranteze. De asemenea, puteți specifica intervale de caractere, de exemplu, .
  • [XYZ ]+–  se potrivește cu un caracter dintr-un set repetat de una sau de mai multe ori.
  • [^A-Z]–  în setul de caractere „^” este folosit ca semn de negație. În acest exemplu, modelul se potrivește cu orice nu este litere mari.

Steaguri:

Există cinci steaguri opționale în expresia regulată JavaScript. Ele pot fi folosite singure sau împreună și sunt plasate după bara oblică. De exemplu: /[ A-Z]/g. Aici voi da doar două steaguri.

g–  căutare globală.

i–  căutare fără distincție între majuscule și minuscule.

Modele suplimentare

(X )–   capturarea parantezelor. Această expresie se potrivește cu x și își amintește potrivirea, astfel încât să o puteți utiliza mai târziu.

(?:X )–  paranteze necapturante. Expresia se potrivește cu x, dar nu își amintește acea potrivire.

Se potrivește cu x numai dacă este urmat de y .

Testarea materialului studiat

Să testăm mai întâi toate cele de mai sus. Să presupunem că vrem să verificăm un șir pentru orice cifre. Puteți folosi construcția „d” pentru aceasta.

console.log(/d/.test("12-34"));
// dreapta

Codul de mai sus returnează adevărat dacă există cel puțin o cifră în șir. Ce se întâmplă dacă trebuie să verificați dacă un șir se potrivește cu formatul? Puteți utiliza mai multe caractere „d” pentru a defini formatul:

console.log(/dd-dd/.test("12-34"));
//dreapta
console.log(/dd-dd/.test("1234"));
//gresit

Dacă nu contează modul în care expresia regulată JavaScript online vine cu numere înainte și după semnul „-”, puteți folosi caracterul „+” pentru a indica faptul că modelul „d” apare o dată sau de mai multe ori:

console.log(/d+-d+/.test("12-34"));
// dreapta
console.log(/d+-d+/.test(„1-234”));
// dreapta
console.log(/d+-d+/.test("-34"));
// gresit

Pentru simplitate, parantezele pot fi folosite pentru a grupa expresii. Să presupunem că avem o pisică care miaună și vrem să ne potrivim cu modelul " miau"(miau):

console.log(/me+(ow)+w/.test("meeeeowowowww"));
// dreapta

Acum hai să ne dăm seama.

m => potriviți o literă „m”;

e + => potriviți litera „e” o dată sau de mai multe ori;

(ow) + => potriviți literele „ow” o dată sau de mai multe ori;

w => potriviți litera ‘w’;

„m” + „eeee” + „owowow” + „w”.

Când operatorii precum „+” sunt utilizați imediat după paranteze, aceștia afectează întregul conținut al parantezelor.

operator"? ". Indică faptul că caracterul anterior este opțional. După cum veți vedea mai jos, ambele cazuri de testare revin adevărat deoarece caracterele „s” sunt marcate ca opționale.

console.log(/cats? says?/i.test ("Pisica spune miau"));
//dreapta
console.log(/pisicile? spune?/i.test ("Pisicile spun miau"));
//dreapta

Dacă doriți să găsiți un caracter bară oblică, trebuie să scăpați de el cu o bară oblică inversă. Același lucru este valabil și pentru alte personaje care au o semnificație specială, cum ar fi semnul întrebării. Iată un exemplu de expresie regulată JavaScript despre cum să le cauți:

var slashSearch = ///;
varquestionSearch = /?/;

  • d este la fel ca : fiecare construct corespunde unui caracter numeric.
  • w este la fel ca [ A—Za—z 0-9_]: Ambele expresii se potrivesc cu orice caracter alfanumeric sau liniuță de subliniere.

Exemplu: adăugarea de spații la șirurile scrise cu majuscule camel

În acest exemplu, ne-am săturat foarte mult de scrisul în stil cămilă și avem nevoie de o modalitate de a adăuga spații între cuvinte. Iată un exemplu:

removeCc("camelCase") // => ar trebui să returneze "camel Case"

Există o soluție simplă folosind o expresie regulată. În primul rând, trebuie să găsim totul litere mari. Acest lucru se poate face cu o căutare a unui set de caractere și un modificator global.

Acesta se potrivește cu caracterul „C” din „camelCase”

Acum, cum să adăugați un spațiu înainte de „C”?

Trebuie să folosim parantezele de captare! Ele vă permit să găsiți o potrivire și să vă amintiți să o utilizați mai târziu! Utilizați parantezele de captare pentru a vă aminti litera majusculă găsită:

Puteți accesa valoarea capturată mai târziu astfel:

Mai sus, folosim $1 pentru a accesa valoarea capturată. Apropo, dacă am avea două seturi de paranteze de captare, am folosi $1 și $2 pentru a ne referi la valorile capturate și, în mod similar, pentru Mai mult paranteze de captare.

Dacă trebuie să utilizați paranteze, dar nu trebuie să captați acea valoare, puteți utiliza paranteze care nu se captează: (?: x ). În acest caz, se găsește o potrivire x, dar nu este reținută.

Să revenim la sarcina curentă. Cum implementăm capturarea parantezelor? Cu metoda de înlocuire a expresiilor regulate JavaScript! Trecem „$1” ca al doilea argument. Este important să folosiți ghilimele aici.

funcția removeCc(str)(
returnează str.replace(/()/g, „$1”);
}


Să ne uităm din nou la cod. Luăm litera mare și apoi o înlocuim cu aceeași literă. În interiorul ghilimelelor, introduceți un spațiu urmat de variabila $1 . Ca rezultat, obținem un spațiu după fiecare literă majusculă.

funcția removeCc(str)(
returnează str.replace(/()/g, „$1”);
}
removeCc("camelCase") // "camel Case"
removeCc("helloWorldItIsMe") // "bună lumea, sunt eu"

Exemplu: eliminați majuscule

Acum avem un șir cu o grămadă de majuscule inutile. Ai ghicit cum să le elimini? În primul rând, trebuie să selectăm toate majusculele. Apoi folosim o căutare de set de caractere folosind modificatorul global:

Vom folosi din nou metoda de înlocuire, dar cum facem caracterul cu minuscule de data aceasta?

functie minuscule(str)(
return str.replace(//g, ???);
}


Sugestie: În metoda replace(), puteți specifica o funcție ca al doilea parametru.

Vom folosi o funcție săgeată pentru a nu captura valoarea potrivirii găsite. Când utilizați funcția în Metoda JavaScript regexp înlocui această funcție va fi apelată după ce se găsește o potrivire și rezultatul funcției este folosit ca șir de înlocuire. Și mai bine, dacă potrivirea este globală și sunt găsite mai multe potriviri, funcția va fi apelată pentru fiecare potrivire găsită.

functie minuscule(str)(
returnează str.replace(//g, (u) => u.toLowerCase());
}
minuscule(„caz de cămilă”) // „caz de cămilă”
minuscule ("bună lume, sunt eu") // "bună lume sunt eu"

Exemplu: convertiți prima literă în majusculă

capitalize("camel case") // => ar trebui să returneze "camel case"

Să folosim din nou funcția în metoda înlocuire(). Cu toate acestea, de data aceasta trebuie să căutăm doar primul caracter din șir. Amintiți-vă că simbolul „^” este folosit pentru aceasta.

Să ne oprim asupra simbolului „^” pentru un moment. Amintiți-vă exemplul de mai devreme:

console.log(/cat/.test("pisica spune miau"));
//dreapta

La adăugarea caracterului „^”, funcția nu mai returnează adevărat deoarece cuvântul „pisica” nu este la începutul liniei.

Expresiile regulate sau expresiile regulate sunt intimidante pentru începători, dar esențiale pentru orice programator. Să înțelegem expresiile regulate cu 5 exemple simple de JavaScript.

Dacă aveți o problemă și o veți rezolva cu expresii regulate - acum aveți două probleme. Există o astfel de zicală. Expresiile obișnuite găsite în cod provoacă uneori frică și ură la oamenii care nu sunt familiarizați cu ele.

Dar, de fapt, orice regex este doar o expresie șablon care poate rezolva problema unei întregi funcții într-o singură linie. Totuși, pentru a construi o expresie obișnuită, trebuie să ții cont de un set de reguli stricte în care un începător se poate încurca și poate face greșeli.

Caractere potrivite

Cele mai elementare expresii regulate sunt cele care caută potriviri cu un singur caracter. Iată regulile lor:

1. Un punct (.) se potrivește cu orice caracter. Dacă doriți să căutați un punct, acesta trebuie să fie scapat cu caracterul „\” (\.).

2. Semnul întrebării (?) înseamnă că caracterul anterior este opțional. Pentru a căuta semnul de întrebare în sine într-un șir, acesta trebuie să fie și evadat cu „\” (\?).

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu."; // Atât „elit” cât și „elat” vor face. Un punct înseamnă că orice personaj va face. var regex = /el.t/g; console.log(text.match(regex)); // „est” și „lest” sunt aceleași. Semnul întrebării face „l” opțional. var regex2 = /l?est/g; console.log(text.match(regex2));

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu.";

// Atât „elit” cât și „elat” vor face. Un punct înseamnă că orice personaj va face.

var regex = /el.t/g ;

consolă. jurnal (text . potrivire (regex) );

// „est” și „lest” sunt aceleași. Semnul întrebării face „l” opțional.

var regex2 = /l?est/g ;

consolă. jurnal (text . potrivire (regex2) );

Potrivire cu mai multe caractere

Un set este unul sau mai multe caractere cuprinse între paranteze, cum ar fi . O astfel de expresie va căuta doar acel set de caractere din șir - în acest exemplu, doar a, b sau c. Puteți, dimpotrivă, să căutați aparițiile oricărui caracter, cu excepția simbolului „^”. [^abc] se va potrivi cu orice caracter care nu este a, b sau c. De asemenea, puteți specifica o serie de caractere sau numere, cum ar fi , .

Există seturi de caractere încorporate care fac expresiile regulate mai ușor de scris. Ele sunt numite abrevieri sau stenografie. De exemplu, puteți scrie \D în schimb. Există abrevieri pentru alte caractere (inclusiv numere și caractere de subliniere) - \w și \W, precum și pentru spații - \s și \S.

// Doar „pisica” și „poate” vor face, nu „mașină”. var text = „cu mașină pisică”; console.log(text.match(/ca/g)); // Se potrivește cu totul, cu excepția pisicii și can (există un caracter ^) console.log(text.match(/ca[^tn]/g)); // Un alt exemplu în care doar numerele vor trece text = „Aș dori 8 cești de cafea, te rog.”; console.log("Câte cești: " + text.match(//g)); // Mod mai simplu cu \d shorthand console.log("Câte cupe: " + text.match(/\d/g)); // Potriviți totul, cu excepția numerelor console.log(text.match(/\D/g));

// Doar „pisica” și „poate” vor face, nu „mașină”.

var text = "cu mașină cu pisică" ;

consolă. jurnal (text . potrivire (/ca/g ) ) ;

// Transmite totul, cu excepția pisicii și a canului (caracterul ^ este prezent)

consolă. jurnal (text . potrivire (/ca[^tn]/g ) ) );

// Un alt exemplu în care vor trece numai numere

text = "Aș dori 8 căni de cafea, te rog.";

consolă. jurnal ("Câte cupe: " + text . potrivi (//g ) ) ;

// Mod mai ușor cu abrevierea \d

consolă. log ("Câte cupe: " + text . potrivire (/\d/g ) ) ;

// Treci totul, în afară de numere

consolă. jurnal (text . potrivire (/\D/g ) ) ;

Cuvinte potrivite

În cele mai multe cazuri, trebuie să căutați cuvinte întregi, nu caractere individuale. Acest lucru se face cu modificatorii (+) și (-), care repetă un caracter sau un set de caractere.

Adăugarea (X) specifică numărul exact de repetări, (x, y) intervalul (x și y sunt numere).

În plus, există un model special \b care se potrivește cu granițele cuvintelor.

var text = "Bună ziua, oamenii anului 1974. Vin din viitor. În 2014 avem pistoale laser, plăci hover și trăim pe lună!"; // Găsiți ani. \d+ se potrivește cu unul sau mai multe caractere var yearRegex = /\d+/g; console.log("Ani: ", text.match(yearRegex)); // Găsiți toate ofertele. Propozițiile noastre încep cu o literă mare și se termină cu un punct sau un semn de exclamare. var sentenceRegex = /.+?(\.|!)/g; console.log("Propoziții: ", text.match(sentenceRegex)); // Găsește toate cuvintele care încep cu „h”. Putem folosi atât litere mari, cât și litere mici, așa că folosim modificatorul i // \b pentru a defini limitele cuvintelor. var hWords = /\bh\w+/ig; console.log("Cuvinte H: ", text. potrivire(Cuvinte h)); // Găsiți toate cuvintele între 4 și 6 caractere var findWords = /\b\w(4,6)\b/g; console.log("Cuvinte între 4 și 6 caractere: ", text.match(findWords)); // Găsiți cuvinte mai lungi de 5 caractere console.log("Cuvinte de 5 caractere sau mai lungi: ", text.match(/\b\w(5,)\b/g)); // Potriviți cuvinte cu exact 6 caractere lungi console.log("Cuvinte cu exact 6 caractere lungi: ", text.match(/\b\w(6)\b/g));

var text = "Bună ziua, oamenii anului 1974. Vin din viitor. În 2014 avem pistoale laser, plăci hover și trăim pe Lună!";

// Găsiți ani. \d+ se potrivește cu unul sau mai multe caractere

var yearRegex = /\d+/g ;

consolă. jurnal ("Ani: " , text . potrivire (yearRegex ) ) ;

// Găsiți toate ofertele. Propozițiile noastre încep cu o literă mare și se termină cu un punct sau un semn de exclamare.

var sentenceRegex = /.+?(\.|!)/g ;

consolă. jurnal ("Sentences: " , text . match (sentenceRegex ) ) ;

// Găsește toate cuvintele care încep cu „h”. Putem folosi atât litere mari, cât și litere mici, așa că folosim modificatorul i

// \b pentru a defini o limită de cuvânt.

var hWords = /\bh\w+/i g ;

consolă. jurnal ("H Words: " , text . match (hWords) ) ;

// Găsiți toate cuvintele între 4 și 6 caractere

var findWords = /\b\w(4,6)\b/g ;

consolă. Buturuga( "Cuvinte între 4 și 6 caractere: ", text . potrivire (findWords));

// Găsiți cuvinte mai lungi de 5 caractere

consolă. jurnal ("Cuvinte de 5 caractere sau mai mult: " , text . potrivire (/\b\w(5,)\b/g ) ) ;

// Găsiți cuvinte cu exact 6 caractere lungime

consolă. Buturuga( „Cuvinte cu exact 6 caractere:”, text . potrivire (/\b\w(6)\b/g ) );

Validarea întregii linii

În JavaScript, astfel de expresii pot fi folosite pentru a valida introducerea utilizatorului din câmpurile de text. Pentru validarea șirurilor, se folosește o expresie regulată regulată, legată de începutul și sfârșitul unui fragment de text, folosind expresia ^ (începutul unei linii) și $ (sfârșitul unei linii) pentru această expresie. Aceste simboluri asigură că modelul pe care îl scrieți acoperă întreaga lungime a textului și nu se potrivește doar cu o parte a acestuia.

De asemenea, în acest caz, folosim metoda test() a obiectului regex, care returnează adevărat sau fals atunci când verificăm dacă expresia regulată se potrivește cu șirul.

// Avem o serie de șiruri de caractere, să găsim link-uri..com/", "123461", "https://site/?s=google", "http://nu este un URL valid", "abc http: / /invalid.url/" ]; var regex = /^https?:\/\/[\w\/?.&-=]+$/; var URL = ; for(var i = 0; i< strings.length; i++){ if(regex.test(strings[i])){ // Валидная ссылка urls.push(strings[i]); } } console.log("Valid URLs: ", urls);

// Avem o serie de șiruri, haideți să găsim link-uri.

varstrings = [

„https://site/”,

„aceasta nu este o adresă URL”,

„https://google.com/”,

"123461" ,

„https://website/?s=google” ,

„http://nu este o adresă URL validă”,

„abc http://invalid.url/”

var regex = / ^ https ? : \ / \ / [ \ w \ / ? . & -= ] + $ / ;

var URL = ;

pentru (var i = 0; i< strings . length ; i ++ ) {

if (regex. test (șiruri [i])) (

URL-uri. împinge(șiruri[i]);

consolă. log("Adrese URL valide: ", URL-uri);

Căutați și înlocuiți

O altă sarcină comună care este facilitată prin utilizarea expresiilor regulate este găsirea și înlocuirea textului.

  • Serghei Savenkov

    un fel de recenzie „rare”... parcă s-ar grăbi undeva