Expresii regulate 1

Ei lucrează printr-un obiect special RegExp.

În plus, rândurile au propriile metode de căutare, potrivire, înlocuire. Dar, pentru a le înțelege, să analizăm mai întâi RegExp.







Obiectul de tip RegExp. sau, pe scurt, o expresie regulată, puteți crea două moduri

modelul este o expresie regulată pentru căutare (despre înlocuirea ulterioară), iar steagurile reprezintă un șir de orice combinație de caractere g (căutare globală), i (caz nesemnificativ) și m (căutare multiplă).

Prima metodă este folosită frecvent, uneori metoda a doua. De exemplu, două astfel de apeluri sunt echivalente:

La al doilea apel - deoarece expresia regulată în citate, trebuie să copiați \

Când căutați, puteți utiliza cele mai multe dintre caracteristicile sintaxei PCRE moderne.

Pentru personaje obișnuite - le face deosebite. De exemplu, expresia / s / caută doar caracterul "s". Și dacă puneți \ în fața lui s, atunci \ \ s / denumează deja un caracter al spațiului alb. Dimpotrivă, dacă caracterul este special, de exemplu *, atunci \ va face doar caracterul obișnuit "asterisc". De exemplu, / a * / caută 0 sau mai multe caractere consecutive "a". Pentru a găsi un asterisc 'a *' - pune \ înainte de spets. de simbolul: / a \ * /.

Indică începutul datelor de intrare. Dacă este setat steagul de căutare multilaterală ("m"). atunci va funcționa și atunci când începe o nouă linie. De exemplu, / ^ A / nu găsește 'A' în 'A', dar găsește primul 'A' în 'An A.'

Indică sfârșitul datelor de intrare. Dacă este setat steagul de căutare multilaterală, acesta va funcționa și la sfârșitul liniei. De exemplu, / t $ / nu va găsi "t" în "mâncător", dar îl va găsi în "mâncare".

Indică o repetare de 0 sau de mai multe ori. De exemplu, / bo * / va găsi "boooo" în "A fantomă booooed" și "b" în "O pasăre warbled", dar nu va găsi nimic în "A goat grunted".

Indică o repetare de 1 sau mai multe ori. Echivalent. De exemplu, / a + / va găsi "a" în "bomboane" și tot "a" în "caaaaaaaandy".

(Punct zecimal) înseamnă orice caracter, cu excepția feedului de linie: \ n \ r \ u2028 sau \ u2029. (puteți utiliza [\ s \ S] pentru a căuta orice caracter, inclusiv pauze de linie). De exemplu, /.n/ va găsi "an" și "on" în "nu, un măr este pe copac", dar nu "nay".

Găsește x și își amintește. Aceasta se numește "paranteze de memorie". De exemplu, / (foo) / găsește și își amintește "foo" în "foo bar". Subrecursul găsit este stocat în matricea rezultatelor căutării sau în proprietățile predefinite ale obiectului RegExp: $ 1. $ 9. În plus, brackets combină ceea ce este în ele, într-un singur element al modelului. De exemplu, (abc) * este o repetare abc 0 sau de mai multe ori.

Găsește x. dar nu-și amintește ce sa găsit. Aceasta se numește "paranteze care nu se memorează". Substringul compensată nu sunt stocate în rezultatele matrice și proprietățile RegExp.Kak și toate parantezele, situate le uni într-un singur podpattern.

Găsește x. Numai dacă x urmează y. De exemplu, / Jack (? = Sprat) / găsește "Jack" numai dacă este urmată de "Sprat". / Jack (? = Sprat | Frost) / va găsi "Jack" numai dacă este urmat de "Sprat" sau "Frost". Cu toate acestea, nici "Sprat", nici "Frost" nu vor fi incluse în rezultatul căutării.

Găsește x. Numai dacă x nu urmează y. De exemplu, /\d+ (?!\.)/ va găsi un număr numai dacă nu este urmat de un punct zecimal. /\d+(?!\)/.exec("3.141 ") va găsi 141, dar nu 3.141.

Găsește x sau y. De exemplu, / green | red / va găsi "verde" în "măr verde" și "roșu" în "măr roșu".

Unde n este un număr întreg pozitiv. Găsiți exact n repetări ale elementului precedent. De exemplu, / a / nu va găsi "a" în "bomboană", dar va găsi atât un "caandy", cât și primele două a în "caaandy".

Unde n este un număr întreg pozitiv. Găsește n sau mai multe repetări ale elementului. De exemplu, / a nu găsește "a" în "bomboană", dar găsește totul "a" în "caandy" și în "caaaaaaandy".

Unde n și m sunt numere întregi pozitive. Găsiți repetări de la n la m.

Set de caractere. Găsește oricare dintre caracterele listate. Puteți specifica un decalaj folosind o linie. De exemplu, [abcd] este același cu [a-d]. Găsiți "b" în "piept", precum și "a" și "c" în "durere".

Orice caracter diferit de cel specificat în set. De asemenea, puteți specifica un decalaj. De exemplu, [^ abc] este același cu [^ a-c]. Gaseste 'r' in 'brisket' si 'h' in 'chop.'

Găsește caracterul backspace. (Nu trebuie confundat cu \ b.)

Se găsește limita cuvintelor (latină), de exemplu, un spațiu. (Nu trebuie confundat cu [\ b]). De exemplu, / \ bn \ w / va găsi "nu" în "noonday"; / \ wy \ b / va găsi "ly" în "posibil ieri".

Nu indică limita cuvintelor. De exemplu, / \ w \ Bn / găsește "pe" în "noonday", și / y \ B \ w / găsește "voi" în "posibil ieri".

Unde X este litera de la A la Z. Indică caracterul de control din linie. De exemplu, / \ cM / denotă caracterul Ctrl-M.

găsește un număr din orice alfabet (avem același Unicode). Utilizați [0-9] pentru a găsi numai cifre normale. De exemplu, / \ d / sau [0-9] / va găsi "2" în "B2 este numărul suita".

Găsiți un caracter non-numeric (toate alfabetele). [^ 0-9] este echivalentul cifrelor obișnuite. De exemplu, / \ D / sau [[0-9] / va găsi "B" în "B2 este numărul suita".

Caracterele speciale corespunzătoare pentru feed-uri, feed-line, feed-line.

Găsește orice caracter al spațiului alb, incluzând un spațiu, o filă, o pauză de linie și alte caractere din spațiul unicode. De exemplu, / \ s \ w * / va găsi "bar" în "foo bar".

Găsește orice caracter, cu excepția caracterului spațial. De exemplu, / \ S \ w * / va găsi "foo" în "foo bar".

Dacă flagul "g" este inclus în expresia regulată, puteți apela metoda de mai multe ori pentru a găsi potriviri succesive pe aceeași linie. Când faceți acest lucru, căutarea începe pe substring str. de la indexul lastindex. De exemplu, aici este un script:

Acest script va afișa următorul text:

În următorul exemplu, funcția caută intrarea. Apoi buclele prin matrice pentru a vedea dacă există alte nume.

Se presupune că toate denumirile înregistrate sunt în matricea A:

Următoarele metode lucrează cu expresii regulate din șiruri de caractere.

Toate metodele, cu excepția înlocuirii, pot fi numite atât cu obiecte de tip regexp în argumente, cât și cu șiruri care sunt convertite automat în obiecte RegExp.

Deci, apelurile sunt echivalente:

Atunci când utilizați citate, trebuie să duplicați \ și nu există nicio modalitate de a specifica steaguri. Dacă expresia regulată este deja dată de un șir, atunci formularul complet este convenabil

Returnează indexul expresiei regulate într-un șir sau -1.

Dacă doriți să știți dacă un șir corespunde unei expresii regulate, utilizați metoda de căutare (similară metodei de testare RegExp). Pentru a obține mai multe informații, utilizați metoda de potrivire mai lentă (similară cu metoda RegExp exec).







Acest exemplu afișează un mesaj, în funcție de faptul dacă șirul se potrivește cu expresia obișnuită.

Dacă regexp nu are flagul g. atunci returnează același rezultat ca regexp.exec (șir).

Dacă regexp are pavilionul g. apoi returnează o matrice cu toate potrivirile.

Pentru a afla dacă șirul se potrivește cu expresia regulată regexp. utilizați regexp.test (șir).

Dacă doriți să obțineți primul rezultat, încercați r egexp.exec (șir).

În exemplul următor, potrivirea este utilizată pentru a găsi "Capitol", urmată de 1 sau mai multe cifre, urmată de cifre separate printr-o perioadă. În expresia regulată, există un steag i. astfel încât registrul va fi ignorat.

Scriptul va returna o serie de potriviri:

  • Capitolul 3.4.5.1 - șir total de potrivire
  • 3.4.5.1 Prima paranteză
  • .1 - consola interioară

Următorul exemplu demonstrează folosirea semnelor de căutare globale și insensibile pentru căsuțe cu potrivire. Vor fi găsite toate literele de la A la E și de la a la e, fiecare - într-un element separat al matricei.

Metoda înlocuire poate înlocui aparițiile unei expresii regulate nu numai cu un șir, ci cu rezultatul unei funcții. Sintaxa sa completă este următoarea:

regexp Obiectul RegExp. Intrarea sa va fi înlocuită cu o valoare care se va returna parametrul numărul 2 substr Un șir de caractere, care va fi înlocuit cu newSubStr. newSubStr String din care subsirului înlocuiește numărul 1. funcția argument funcție care poate fi invocată pentru a genera un nou subșir (pentru a substitui-l în loc subșirurilor care rezultă din argumentul 1).

Metoda de înlocuire nu modifică linia pe care se numește, ci doar returnează un șir nou, modificat.

Pentru a implementa o înlocuire globală, includeți pavilionul "g" în expresia regulată.

Dacă primul argument este un șir, acesta nu este convertit la o expresie regulată, așa că, de exemplu,

Chemarea pentru înlocuire a lăsat șirul neschimbat, pentru că nu am căutat expresia regulată \ s. și linia "\ s".

În linia de înlocuire pot exista caractere speciale:

În cazul în care n sau nn - cifre zecimale, inserează aparițiile subșir, n-lea paranteze imbricate memorate, dacă primul argument - obiectul regexp.

Dacă specificați o funcție ca al doilea parametru, ea este executată de fiecare dată când se potrivește.

Într-o funcție, puteți să generați dinamic și să returnați un șir de substituție.

Primul parametru al funcției este substringul găsit. Dacă primul argument pe care îl înlocuiți este un obiect RegExp. următorii parametri n conțin potriviri de la paranteze imbricate. Ultimii doi parametri sunt poziția în linia pe care a avut loc meciul și șirul în sine.

De exemplu, următorul înlocuire a apelului va reveni la XXzzzz - XX. zzzz.

După cum puteți vedea, există două paranteze în expresia regulată și, prin urmare, există doi parametri în funcția p1. p2.
Dacă ar exista trei paranteze, funcția ar trebui să adauge parametrul p3.

Următoarea funcție înlocuiește cuvintele borderTop la frontieră:

Prin standard, această posibilitate este permisă de ES3, dar ES5 este interzisă.

Datorită faptului că lastIndex se modifică cu ajutorul căutării globale, iar obiectul regexp în sine este static, prima căutare crește cu lastIndex. iar cele ulterioare continuă să caute de pe vechiul lastIndex. și anume nu pot returna toate rezultatele.

Când căutați toate potrivirile din buclă, nu apar probleme. ultima iterație (nereușită) stabilește ultimulIndex la zero.

Pentru o înțelegere comună a expresiilor regulate, puteți citi articolul în wikipedia.

Într-adevăr - este foarte insultătoare că nu există o căutare neabsorbantă înapoi
acesta este un concept fundamental din punctul meu de vedere.
De exemplu, nu aș dori să includ în rezultatul găsirii a ceea ce era necesar pentru a verifica persoana care merge la locație, iar acest lucru este foarte util atunci când înlocuiți înlocuirea.
Și, în general, aș dori ca înlocuirea să nu fie numai pentru o linie de descoperire de $ 0, ci și pentru fiecare buzunar separat: de la $ 0 până la $ n, adică în plus față de parametrul liniei de înlocuire în metoda de înlocuire, au existat șiruri de înlocuire pentru fiecare buzunar.

Aici mă uit la ghidul tău
Set de caractere. Găsește oricare dintre caracterele listate. Puteți specifica un decalaj folosind o linie. De exemplu, [abcd] este același cu [a-d]. Găsiți "b" în "piept" și "c" în "durere".

Există un șir constând din numere naturale, separate de ","
trebuie să fie convertite într-o matrice.
Exemplu (funcționează) dacă știm dimensiunea unui matrice
var a = /(\d+)[\,](\d+)[,,](\d+)[,](\d+)/.exec("10,150,0,1230 ");
alertă ("a [0] =" + a [0] + '\ n' +
"a" [1] = "+ a [1] +" \ n '+
"a [2] =" + a [2] + "\ n '+
"a" [3] = "+ a [3] +" \ n '+
"a [4] =" + a [4]
);

Dacă nu cunoaștem dimensiunea matricei (numărul liniilor naturale dintr-un rând)
Exemplu (tip) (NU funcționează):
var a = /(\d))[[,](\d+)]*/.exec("10,150,0,1230,11,1234 ");
Pot să fac fără o buclă suplimentară (doar o expresie regulată)?

Ajutați-vă cu corectitudinea expresiei.

și anume 6 perechi de caractere cu restricție: numere de la 0 la 9 sau lat. litere de la A la F, separate de un colon.

1) Am greșit în cod?
2) dacă modelul este corect compus -
și că este aici o astfel de opțiune - nu știu cum diferă și este potrivit
/ ^ \ s * ([\ d [A-F] :) [\ d [A-F]

Băieți, am nevoie de ajutor.
în câmpul de introducere am inserat o linie care conține o rupere de linie, de exemplu, din aceeași secțiune, copiați linia de cod "var myArray = myRe.exec (" cdbBdbsbz ");
"Și în intrare sunt obținute 2 linii, deci nu ar trebui să fie, trebuie să șirezi.
Scriu următoarea expresie regulată:

$ ('input.search_fild') schimbare (function () var enter = $ (this) .val ();
var nouString = enter.replace (/ \ r \ n /, / \ s /);
alertă (newString);
>);

și anume Schimba linia de rupere într-un spațiu. Și nu funcționează, este încă la intrarea a 2 linii.
Pentru verificare:

$ ('input.search_fild') schimbare (function () var enter = $ (this) .val ();
var nouString = enter.replace (/ abc /, "1");
alertă (newString);
>);

în intrare a scris "abb" - funcționează, se schimbă la "1".
P.S. Prin modul în care funcționează schimbarea după pierderea atenției de către intuiție, dar cât de repede?

există un lucru minunat de a lucra cu regularii - RegexBuddy. La mâna, îmi pare rău, nu există nici o legătură, nu lucrul în sine. Dar cine nu este leneș, vă sfătuiesc să vă uitați mai atent. Conține iluminarea instrumentelor de testare regulate, exemple pentru multe limbi + biblioteca celor mai obișnuiți utilizatori obișnuiți

Există o linie, dacă este foarte simplistă, se pare că "aba"
Este necesar să găsim în acest rând totul: "ab" și "ba".
pentru că indicele de la care să înceapă următoarea căutare crește în acest exemplu se va găsi fie "ab", fie "ba", dar în acest exemplu, rezultatul căutării trebuie să primească ambele valori, adică "ab" și "ba", și nu unul dintre ele. Există o soluție elegantă în expresii regulate pentru acest tip de căutare fără bucle și alte suplimente?
Firește, exemplul este simplificat pentru a fi rușinos, în realitate linia în care trebuie să căutați toate variantele posibile este mult mai mare, iar valorile cerute sunt mult mai complicate. Sau poate fi posibil să gestionăm cumva lastIndex "(un index din care să înceapă următoarea căutare)?
P.S. Nu caut o soluție la această problemă. De asemenea, pot să găsesc o soluție sau o metodă elegantă (scurtă și simplă) pe care nu o cunosc (dacă mi-am lipsit ceva în articol, îmi cer scuze în avans).

Bună ziua!

Spuneți-mi cum să scrieți corect o declarație obișnuită pentru a găsi o apariție specifică a unui șir în interiorul marcajului.

Iată un exemplu de marcare:

ABCDEFG nbsp Scenariu:

Iată cum arată utilizatorul:
scenariu:
ABCDEFG Scenariu:

Am venit cu un șir cu marcaj și trebuie să formatezi șirul "Scenariu:" într-un anumit mod, dacă este la începutul liniei, dacă precede această linie linii, atunci linia nu ar trebui găsită. În acest caz, toate caracterele spațiului precedent trebuie salvate.
În primul caz, trebuie să găsesc linia "Scenariu:", pentru că din punct de vedere vizual, este la începutul liniei în fața căreia precede un anumit număr de spații. În cel de-al doilea caz, șirul "Scenariu:" nu ar trebui găsit; Înainte de această linie precedată de caracterele "ABCDEFG".

Aș fi foarte recunoscător dacă ați putea să mă ajutați să rezolv această problemă

Bună ziua!

Spuneți-mi cum să scrieți corect o declarație obișnuită pentru a găsi o apariție specifică a unui șir în interiorul marcajului.

Iată un exemplu de marcare:

scenariu:


ABCDEFG nbsp Scenariu:

Iată cum arată utilizatorul:

Am venit cu un șir cu marcaj și trebuie să formatezi șirul "Scenariu:" într-un anumit mod, dacă este la începutul liniei, dacă precede această linie linii, atunci linia nu ar trebui găsită. În acest caz, toate caracterele spațiului precedent trebuie salvate.
În primul caz, trebuie să găsesc linia "Scenariu:", pentru că din punct de vedere vizual, este la începutul liniei în fața căreia precede un anumit număr de spații. În cel de-al doilea caz, șirul "Scenariu:" nu ar trebui găsit; Înainte de această linie precedată de caracterele "ABCDEFG".

Aș fi foarte recunoscător dacă ați putea să mă ajutați să rezolv această problemă







Articole similare

Trimiteți-le prietenilor: