regulárne výrazy javascript ako povoliť prázdny reťazec. regulárne výrazy JavaScriptu

  • 18.06.2019

Regulárne výrazy

Regulárny výraz je objekt, ktorý popisuje šablónu postavy. Trieda RegExp v JavaScripte predstavuje regulárne výrazy a objekty tried String a RegExp definujú metódy, ktoré používajú regulárne výrazy na vykonávanie operácií porovnávania vzorov a nahrádzania textu. Gramatika regulárneho výrazu v JavaScripte obsahuje pomerne kompletnú podmnožinu syntaxe regulárneho výrazu používanú v Perle 5, takže ak poznáte Perl, mali by ste byť schopní ľahko písať vzory v programoch JavaScript.

Funkcie regulárnych výrazov Perl, ktoré nie sú podporované v ECMAScript, zahŕňajú príznaky s (jednoriadkový režim) a x (rozšírená syntax); únikové sekvencie \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z a \G a ďalšie rozšírené konštrukcie začínajúce na (?.

Definovanie regulárnych výrazov

V JavaScripte sú regulárne výrazy reprezentované objektmi. Regexp. Objekty RegExp možno vytvoriť pomocou konštruktora RegExp(), ale častejšie sa vytvárajú pomocou špeciálnej doslovnej syntaxe. Rovnako ako reťazcové literály sú špecifikované ako znaky uzavreté v úvodzovkách, literály regulárneho výrazu sú špecifikované ako znaky uzavreté v dvojici znakov lomky (/). Kód JavaScript teda môže obsahovať riadky podobné tomuto:

Varpattern = /s$/;

Tento riadok vytvorí nový objekt RegExp a priradí ho k premennej vzoru. Tento objekt RegExp hľadá všetky reťazce, ktoré končia na „s“. Rovnaký regulárny výraz možno definovať pomocou konštruktora RegExp():

Varpattern = new RegExp("s$");

Špecifikácia vzoru regulárneho výrazu pozostáva zo sekvencie znakov. Väčšina znakov, vrátane všetkých alfanumerických znakov, doslova popisuje znaky, ktoré musia byť prítomné. To znamená, že regulárny výraz /java/ zodpovedá všetkým reťazcom obsahujúcim podreťazec "java".

Ostatné znaky v regulárnych výrazoch nie sú určené na vyhľadávanie ich presných ekvivalentov, ale majú osobitný význam. Napríklad regulárny výraz /s$/ obsahuje dva znaky. Prvý znak s označuje hľadanie doslovného znaku. Druhý, $, je špeciálny metaznak, ktorý označuje koniec riadku. Tento regulárny výraz sa teda zhoduje s ľubovoľným reťazcom, ktorý končí na s.

Nasledujúce časti popisujú rôzne znaky a metaznaky používané v regulárnych výrazoch JavaScriptu.

Doslovné symboly

Ako už bolo uvedené, všetky abecedné znaky a čísla v regulárnych výrazoch sa zhodujú. Syntax regulárneho výrazu JavaScript podporuje aj možnosť špecifikovať určité neabecedné znaky pomocou sekvencií escape, ktoré začínajú znakom spätnej lomky (\). Napríklad sekvencia \n sa zhoduje so znakom nového riadku. Tieto znaky sú uvedené v tabuľke nižšie:

Niektoré interpunkčné znamienka majú v regulárnych výrazoch osobitný význam:

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

Význam týchto symbolov je vysvetlený v nasledujúcich častiach. Niektoré z nich majú osobitný význam iba v určitých kontextoch regulárnych výrazov, zatiaľ čo v iných kontextoch sa berú doslovne. Vo všeobecnosti však platí, že ak chcete ktorýkoľvek z týchto znakov doslova zahrnúť do regulárneho výrazu, musíte pred ním uviesť znak spätnej lomky. Ostatné znaky, ako sú úvodzovky a @, nemajú žiadny špeciálny význam a jednoducho sa zhodujú v regulárnych výrazoch.

Ak si presne nepamätáte, ktorému znaku by malo predchádzať \, pokojne môžete pred ktorýkoľvek zo znakov vložiť opačnú lomku. Majte však na pamäti, že mnohé písmená a čísla nadobúdajú osobitný význam spolu s lomkou, takže písmenám a číslam, ktoré hľadáte doslova, by nemalo predchádzať \. Ak chcete do regulárneho výrazu zahrnúť samotný znak spätnej lomky, musíte pred ním zadať ďalší znak spätnej lomky. Napríklad nasledujúci regulárny výraz sa zhoduje s ľubovoľným reťazcom, ktorý obsahuje znak spätnej lomky: /\\/.

Triedy postáv

Jednotlivé doslovné znaky možno spájať do tried znakov tak, že ich uzatvoríte do hranatých zátvoriek. Trieda znakov sa zhoduje s akýmkoľvek znakom v tejto triede. Preto sa regulárny výraz // zhoduje s jedným zo znakov a, b alebo c.

Je možné definovať aj negované triedy znakov, ktoré zodpovedajú akémukoľvek znaku okrem tých, ktoré sú uvedené v zátvorkách. Negovaná trieda znakov je určená znakom ^ ako prvým znakom za ľavou zátvorkou. Regulárny výraz /[^abc]/ zodpovedá akémukoľvek znaku okrem a, b alebo c. V triedach znakov môže byť rozsah znakov špecifikovaný pomlčkou. Všetky malé písmená latinky sa hľadajú pomocou výrazu // a akékoľvek písmeno alebo číslo zo sady znakov latinky možno nájsť pomocou výrazu //.

Niektoré triedy znakov sa používajú obzvlášť často, takže syntax regulárneho výrazu v JavaScripte obsahuje špeciálne znaky a sekvencie escape na ich označenie. Napríklad \s sa zhoduje s medzerami, tabulátormi a akýmikoľvek znakmi medzier zo sady Unicode a \S sa zhoduje so všetkými znakmi, ktoré nie sú medzerami zo sady Unicode.

V tabuľke nižšie sú uvedené tieto špeciálne znaky a syntax tried znakov. (Upozorňujeme, že niektoré sekvencie escape triedy znakov sa zhodujú iba so znakmi ASCII a nie sú rozšírené tak, aby fungovali so znakmi Unicode. Môžete explicitne definovať svoje vlastné triedy znakov Unicode, napríklad /[\u0400-\u04FF]/ sa zhoduje s ľubovoľným znakom azbuky. )

Triedy znakov regulárneho výrazu JavaScript
Symbol Zhoda
[...] Ktorýkoľvek zo znakov v zátvorkách
[^...] Ktorýkoľvek zo znakov, ktorý nie je v zátvorkách
. Akýkoľvek znak iný ako nový riadok alebo iný oddeľovač reťazca Unicode
\w Akýkoľvek textový znak ASCII. Ekvivalentne
\W Akýkoľvek znak, ktorý nie je textovým znakom ASCII. Ekvivalentné [^a-zA-Z0-9_]
\s Akýkoľvek znak medzery zo sady Unicode
\S Akýkoľvek znak bez medzier zo znakovej sady Unicode. Všimnite si, že \w a \S nie sú rovnaké
\d Akékoľvek číslice ASCII. Ekvivalentne
\D Akýkoľvek znak okrem číslic ASCII. Ekvivalentné [^0-9]
[\b] doslovný znak backspace

Všimnite si, že sekvencie špeciálnych znakov triedy môžu byť uzavreté v hranatých zátvorkách. \s sa zhoduje s akýmkoľvek znakom medzery a \d sa zhoduje s akoukoľvek číslicou, takže /[\s\d]/ sa zhoduje s ľubovoľným znakom alebo číslicou medzery.

Opakovanie

S doteraz získanými znalosťami syntaxe regulárnych výrazov môžeme dvojciferné číslo opísať ako /\d\d/ alebo štvormiestne ako /\d\d\d\d/, ale nedokážeme napr. , opisujú číslo pozostávajúce z ľubovoľného počtu číslic alebo reťazca troch písmen, za ktorými nasleduje voliteľná číslica. Tieto zložitejšie vzory používajú syntax regulárneho výrazu na určenie toho, koľkokrát sa môže daný prvok regulárneho výrazu opakovať.

Symboly označujúce opakovanie vždy zodpovedajú vzoru, na ktorý sa vzťahujú. Niektoré druhy opakovaní sa používajú pomerne často a pre tieto prípady existujú špeciálne symboly. Napríklad znak + sa zhoduje s jedným alebo viacerými výskytmi predchádzajúceho vzoru. Nasledujúca tabuľka je súhrnom syntaxe opakovania:

Nasledujúce riadky ukazujú niekoľko príkladov:

Varpattern = /\d(2,4)/; // Zhoduje sa s číslom obsahujúcim dve až štyri číslice vzor = /\w(3)\d?/; // Zhoduje sa presne s tromi znakmi slova a jedným voliteľným vzorom číslic = /\s+java\s+/; // Zhoduje sa slovo "java" s jednou alebo viacerými medzerami // pred a za ním vzor = /[^(]*/; // Zhoduje sa nula alebo viac znakov iných ako úvodná zátvorka

Buďte opatrní pri používaní opakujúcich sa znakov * a ?. Môžu zodpovedať absencii vzoru, ktorý im predchádza, a teda absencii znakov. Napríklad regulárny výraz /a*/ sa zhoduje s reťazcom "bbbb", pretože neobsahuje znak a.

Znaky opakovania uvedené v tabuľke zodpovedajú maximálnemu možnému počtu opakovaní, čo zabezpečuje vyhľadávanie nasledujúcich častí regulárneho výrazu. Hovoríme, že ide o „chamtivé“ opakovanie. Opakovanie je možné realizovať aj „nežravým“ spôsobom. Za znak (alebo znaky) opakovania stačí uviesť otáznik: ??, +?, *? alebo dokonca (1,5)?.

Napríklad regulárny výraz /a+/ sa zhoduje s jedným alebo viacerými výskytmi písmena a. Aplikovaný na reťazec "aaa" zodpovedá všetkým trom písmenám. Na druhej strane, /a+?/ zodpovedá jednému alebo viacerým výskytom písmena a a vyberie najmenší možný počet znakov. Aplikovaný na rovnaký reťazec sa tento vzor zhoduje iba s prvým písmenom a.

„Nechtivé“ opakovanie nie vždy prinesie očakávaný výsledok. Zvážte vzor /a+b/, ktorý sa zhoduje s jedným alebo viacerými a, za ktorým nasleduje b. Pre reťazec "aaab" sa zhoduje s celým reťazcom.

Teraz sa pozrime na „nechtiacu“ verziu /a+?b/. Niekto by si mohol myslieť, že by sa malo zhodovať s a b, pred ktorým by malo byť len jedno a. Ak sa použije na rovnaký reťazec, očakáva sa, že „aaab“ sa bude zhodovať s jedným a a posledným b. V skutočnosti však tomuto vzoru zodpovedá celá šnúrka, ako v prípade „chamtivé“ verzie. Je to preto, že vyhľadávanie vzoru regulárneho výrazu sa vykonáva nájdením prvej pozície v reťazci, z ktorej je možná zhoda. Keďže zhoda je možná od prvého znaku reťazca, kratšie zhody začínajúce od nasledujúcich znakov sa neberú do úvahy.

Alternatívy, zoskupovanie a prepojenia

Gramatika regulárnych výrazov obsahuje špeciálne znaky na definovanie alternatív, zoskupovanie podvýrazov a odkazy na predchádzajúce podvýrazy. Symbol zvislej čiary | slúži na oddelenie alternatív. Napríklad /ab|cd|ef/ sa zhoduje buď s reťazcom "ab" alebo s reťazcom "cd" alebo s reťazcom "ef" a vzor /\d(3)|(4)/ sa zhoduje buď s tromi číslicami alebo štyrmi malými písmenami písmená .

Všimnite si, že alternatívy sa spracúvajú zľava doprava, kým sa nenájde zhoda. Ak sa nájde zhoda s ľavou alternatívou, pravá alternatíva sa ignoruje, aj keď sa dá dosiahnuť „lepšia“ zhoda. Takže keď sa /a|ab/ použije na reťazec "ab", bude sa zhodovať iba s prvým znakom.

Zátvorky majú v regulárnych výrazoch viacero významov. Jednou z nich je zoskupovanie jednotlivých prvkov do jedného podvýrazu, takže prvky pri použití špeciálnych znakov |, *, +, ? a s ostatnými sa zaobchádza ako s jedným. Napríklad vzor /java(script)?/ sa zhoduje so slovom „java“, za ktorým nasleduje voliteľné slovo „script“ a /(ab|cd)+|ef)/ sa zhoduje buď s reťazcom „ef“ alebo s jedným alebo viacerými opakovania jedného z reťazcov "ab" alebo "cd".

Ďalším použitím zátvoriek v regulárnych výrazoch je definovanie podvzorov v rámci vzoru. Keď sa v cieľovom reťazci nájde zhoda regulárneho výrazu, časť cieľového reťazca, ktorá sa zhoduje s ktorýmkoľvek konkrétnym podvzorom v zátvorkách, možno extrahovať.

Predpokladajme, že chcete nájsť jedno alebo viac malých písmen, za ktorými nasleduje jedno alebo viacero čísel. Na to môžete použiť vzor /+\d+/. Predpokladajme však, že chceme iba čísla na konci každého zápasu. Ak umiestnime túto časť vzoru do zátvoriek (/+(\d+)/), potom môžeme extrahovať čísla zo všetkých nájdených zhôd. Ako sa to robí, bude popísané nižšie.

S tým súvisí aj ďalšie použitie podvýrazov v zátvorkách na označenie podvýrazov z predchádzajúcej časti toho istého regulárneho výrazu. To sa dosiahne zadaním jednej alebo viacerých číslic za znakom \. Čísla označujú polohu podvýrazu v zátvorkách v rámci regulárneho výrazu. Napríklad \1 odkazuje na prvý podvýraz a \3 odkazuje na tretí. Všimnite si, že podvýrazy môžu byť vnorené, takže pri počítaní sa používa pozícia ľavej zátvorky. Napríklad v nasledujúcom regulárnom výraze bude odkaz na vnorený podvýraz (skript) vyzerať takto \2:

/(ava(script)?)\sis\s(zábava\w*)/

Odkaz na predchádzajúci podvýraz neukazuje na šablónu tohto podvýrazu, ale na nájdený text, ktorý sa zhoduje s touto šablónou. Preto je možné použiť odkazy na zavedenie obmedzenia, ktoré vyberie časti reťazca, ktoré obsahujú presne tie isté znaky. Napríklad nasledujúci regulárny výraz zodpovedá nule alebo viacerým znakom v jednoduchých alebo dvojitých úvodzovkách. Nevyžaduje sa však, aby sa úvodné a záverečné úvodzovky zhodovali (to znamená, že obe úvodzovky sú jednoduché alebo dvojité):

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

Môžeme požadovať, aby sa cenové ponuky zhodovali s týmto odkazom:

Tu \1 zodpovedá prvej zhode podvýrazu. V tomto príklade odkaz ukladá obmedzenie vyžadujúce, aby sa záverečná ponuka zhodovala s úvodnou ponukou. Tento regulárny výraz neumožňuje jednoduché úvodzovky v dvojitých úvodzovkách a naopak.

Je tiež možné zoskupiť prvky v regulárnom výraze bez vytvorenia číslovaného odkazu na tieto prvky. Namiesto jednoduchého zoskupovania prvkov medzi (a) začnite skupinu znakmi (?: a ukončite ju znakom). Zvážte napríklad nasledujúcu šablónu:

/(ava(?:script)?)\sis\s(zábava\w*)/

Tu je podvýraz (?:script) potrebný iba na zoskupenie, aby bolo možné na skupinu použiť opakujúci sa znak ?. Tieto upravené zátvorky nevytvárajú prepojenie, takže \2 v tomto regulárnom výraze odkazuje na text, ktorý sa zhoduje so vzorom (zábava\w*).

V nasledujúcej tabuľke sú uvedené operátory výberu z alternatív, zoskupení a odkazovania v regulárnych výrazoch:

Znaky regulárneho výrazu si vyberajú z alternatív, zoskupení a odkazov JavaScript
Symbol Význam
| Alternatívne. Zodpovedá buď podvýrazu vľavo, alebo podvýrazu vpravo.
(...) Zoskupovanie. Zoskupuje prvky do jednej entity, ktorú možno použiť s *, +, ?, | atď. Tiež si pamätá znaky zodpovedajúce tejto skupine na použitie v nasledujúcich odkazoch.
(?:...) Iba zoskupovanie. Zoskupuje prvky dohromady, ale nepamätá si znaky zodpovedajúce tejto skupine.
\číslo Zhoduje sa s rovnakými znakmi, ktoré boli nájdené pri porovnávaní s číslom skupiny. Skupiny sú podvýrazy v zátvorkách (prípadne vnorené). Čísla skupín sa prideľujú počítaním ľavých zátvoriek zľava doprava. Skupiny vytvorené so znakmi (?:) nie sú očíslované.

Určenie pozície zápasu

Ako sme už uviedli, veľa prvkov regulárneho výrazu sa zhoduje s jedným znakom v reťazci. Napríklad \s zodpovedá jednému znaku medzery. Ostatné prvky regulárnych výrazov zodpovedajú pozíciám medzi znakmi, nie znakom samotným. Napríklad \b zodpovedá hranici slova – hranici medzi \w (textový znak ASCII) a \W (netextový znak) alebo hranici medzi textovým znakom ASCII a začiatkom alebo koncom riadku.

Prvky ako \b nedefinujú žiadne znaky, ktoré musia byť prítomné v zhodnom reťazci, ale definujú platné pozície pre párovanie. Tieto prvky sa niekedy nazývajú kotviace prvky regulárneho výrazu, pretože ukotvujú vzor na špecifickú pozíciu v reťazci. Častejšie ako iné sa používajú kotviace prvky ako ^ a $, ktoré ukotvujú vzory na začiatok a koniec riadku.

Napríklad slovo „JavaScript“ na vlastnom riadku sa môže zhodovať s regulárnym výrazom /^JavaScript$/. Ak chcete nájsť jedno slovo „Java“ (namiesto predpony, napríklad v slove „JavaScript“), môžete skúsiť použiť vzor /\sJava\s/, ktorý vyžaduje medzeru pred a za slovom.

Toto riešenie však vyvoláva dva problémy. Po prvé, slovo „Java“ nájde iba vtedy, ak je na oboch stranách ohraničené medzerami, a nenájde ho na začiatku ani na konci reťazca. Po druhé, keď sa tento vzor zhoduje, reťazec, ktorý vráti, bude obsahovať medzery na začiatku a na konci, čo nie je presne to, čo chceme. Takže namiesto vzoru, ktorý zodpovedá medzerám \s, použijeme vzor (alebo kotvu), ktorý zodpovedá hraniciam slov \b. Získa sa nasledujúci výraz: /\bJava\b/.

Prvok kotvy \B sa zhoduje s pozíciou, ktorá nie je hranicou slova. To znamená, že vzor /\Bcript/ sa bude zhodovať so slovami "JavaScript" a "postscript" a nebude sa zhodovať so slovami "script" alebo "Scripting".

Ľubovoľné regulárne výrazy môžu tiež pôsobiť ako kotviace podmienky. Vložením výrazu medzi znaky (?= a) sa z neho stane predbežná zhoda pre nasledujúce znaky, pričom sa vyžaduje, aby sa tieto znaky zhodovali so zadaným vzorom, ale neboli zahrnuté v reťazci zhody.

Ak chcete napríklad nájsť zhodu s názvom bežného programovacieho jazyka, za ktorým nasleduje dvojbodka, môžete použiť výraz /ava(script)?(?=\:)/. Tento vzor sa zhoduje so slovom „JavaScript“ v reťazci „JavaScript: The Definitive Guide“, ale nebude sa zhodovať so slovom „Java“ v reťazci „Java in a Nutshell“, pretože za ním nenasleduje dvojbodka.

Ak zadáte podmienku (?!, bude to negatívny dopredný test pre nasledujúce znaky, ktorý vyžaduje, aby sa nasledujúce znaky nezhodovali so zadaným vzorom. Napríklad vzor /Java(?!Script)(\w *)/ sa zhoduje s podreťazcom „Java“, za ktorým nasleduje veľké písmeno a ľubovoľný počet textových znakov ASCII, za predpokladu, že za podreťazcom „Java“ nenasleduje podreťazec „Script“ Zhoduje sa s reťazcom „JavaBeans“, ale nezhoduje sa reťazec „Javanese“ sa zhoduje s reťazcom „JavaScrip“, ale nebude sa zhodovať s reťazcami „JavaScript“ alebo „JavaScripter“.

V tabuľke nižšie sú uvedené kotviace znaky v regulárnych výrazoch:

Kotvy regulárnych výrazov
Symbol Význam
^ Zhoduje sa so začiatkom reťazcového výrazu alebo so začiatkom reťazca pri viacriadkovom vyhľadávaní.
$ Zhoduje sa s koncom reťazcového výrazu alebo s koncom reťazca pri viacriadkovom vyhľadávaní.
\b Zhoduje sa s hranicou slova, t.j. zodpovedá pozícii medzi znakom \w a znakom \W alebo medzi znakom \w a začiatkom alebo koncom reťazca. (Všimnite si však, že [\b] zodpovedá znaku backspace.)
\B Zhoduje sa s pozíciou, ktorá nie je hranicou slova.
(?=p) Pozitívna dopredná kontrola pre nasledujúce znaky. Vyžaduje nasledujúce znaky, aby sa zhodovali so vzorom p, ale nezahŕňa tieto znaky do nájdeného reťazca.
(?!p) Negatívna dopredná kontrola pre nasledujúce znaky. Vyžaduje, aby sa nasledujúce znaky nezhodovali so vzorom p.

Vlajky

A posledný prvok gramatiky regulárnych výrazov. Príznaky regulárneho výrazu definujú pravidlá porovnávania vzorov na vysokej úrovni. Na rozdiel od zvyšku gramatiky regulárnych výrazov sa príznaky nešpecifikujú medzi znakmi lomky, ale za druhým. Jazyk JavaScript podporuje tri príznaky.

vlajka išpecifikuje, že pri vyhľadávaní vzoru sa nerozlišujú malé a veľké písmená a g príznak- že vyhľadávanie musí byť globálne, t.j. musia sa nájsť všetky zhody v reťazci. vlajka m vykoná vyhľadávanie vzoru vo viacriadkovom režime. Ak vyhľadávaný reťazcový výraz obsahuje nové riadky, potom sa v tomto režime kotviace znaky ^ a $ okrem začiatku a konca celého reťazcového výrazu zhodujú aj so začiatkom a koncom každého textového riadku. Napríklad vzor /java$/im sa zhoduje s výrazmi „java“ aj „Java\nis fun“.

Tieto vlajky je možné kombinovať v ľubovoľnej kombinácii. Ak chcete napríklad vyhľadať prvý výskyt slova „java“ (alebo „Java“, „JAVA“ atď.) bez ohľadu na malé a veľké písmená, môžete použiť regulárny výraz bez rozlišovania malých a veľkých písmen /\bjava\b/ i. Ak chcete nájsť všetky výskyty tohto slova v reťazci, môžete pridať príznak g: /\bjava\b/gi.

Metódy triedy reťazcov na porovnávanie vzorov

Až do tohto bodu sme diskutovali o gramatike generovaných regulárnych výrazov, ale nepozreli sme sa na to, ako možno tieto regulárne výrazy v skutočnosti použiť v skriptoch JavaScript. V tejto časti budeme diskutovať o metódach na objekte String, ktoré používajú regulárne výrazy na porovnávanie vzorov, ako aj na vyhľadávanie a nahradzovanie. A potom budeme pokračovať v rozprávaní o porovnávaní vzorov s regulárnymi výrazmi pohľadom na objekt RegExp, jeho metódy a vlastnosti.

Reťazce podporujú štyri metódy využívajúce regulárne výrazy. Najjednoduchšia z nich je metóda Vyhľadávanie(). Ako argument berie regulárny výraz a vracia buď pozíciu prvého znaku nájdeného podreťazca, alebo -1, ak sa nenájde žiadna zhoda. Napríklad nasledujúci hovor vráti 4:

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

Ak argument metódy search() nie je regulárny výraz, najprv sa skonvertuje tak, že sa odovzdá konštruktoru RegExp. Metóda search() nepodporuje globálne vyhľadávanie a ignoruje príznak g vo svojom argumente.

Metóda nahradiť () vykoná operáciu vyhľadávania a nahradenia. Ako prvý argument berie regulárny výraz a ako druhý náhradný reťazec. Metóda hľadá reťazec, pre ktorý je volaná, aby zodpovedal zadanému vzoru.

Ak regulárny výraz obsahuje príznak g, metóda replace() nahradí všetky nájdené zhody náhradným reťazcom. V opačnom prípade nahradí iba prvú nájdenú zhodu. Ak je prvým argumentom metódy replace() reťazec a nie regulárny výraz, potom metóda vykoná doslovné vyhľadávanie reťazca namiesto toho, aby ho konvertovala na regulárny výraz pomocou konštruktora RegExp() ako search() metóda robí.

Ako príklad môžeme použiť metódu replace() na jednotné písanie veľkých písmen slova „JavaScript“ pre celý riadok textu:

// Bez ohľadu na veľkosť písmen, nahradíme slovo požadovaným prípadom var result = "javascript".replace(/JavaScript/ig, "JavaScript");

Metóda replace() je výkonnejšia, ako by naznačoval tento príklad. Pripomeňme, že podvýrazy v zátvorkách v rámci regulárneho výrazu sú číslované zľava doprava a že regulárny výraz si pamätá text, ktorý sa zhoduje s každým z podvýrazov. Ak náhradný reťazec obsahuje znak $, za ktorým nasleduje číslo, metóda replace() nahradí tieto dva znaky textom, ktorý sa zhoduje so zadaným podvýrazom. Toto je veľmi užitočná funkcia. Môžeme ho použiť napríklad na nahradenie priamych úvodzoviek v reťazci typografickými úvodzovkami, ktoré napodobňujú znaky ASCII:

// Úvodzovka je úvodzovka, za ktorou nasleduje ľubovoľný počet znakov // okrem úvodzoviek (my si ich pamätáme), za týmito znakmi // nasleduje ďalšia citácia var quote = /"([^"]*)"/g; / / Nahraďte rovné úvodzovky typografickými a ponechajte "$1" nezmenené // Obsah citácie uložený v $1 var text = ""JavaScript" je interpretovaný programovací jazyk."; var result = text.replace(quote, ""$1"") ; // "JavaScript" je interpretovaný programovací jazyk.

Dôležité je poznamenať, že druhým argumentom na nahradenie() môže byť funkcia, ktorá dynamicky vypočítava náhradný reťazec.

Metóda zápas() je najvšeobecnejšia z metód triedy String, ktorá používa regulárne výrazy. Ako jediný argument berie regulárny výraz (alebo konvertuje svoj argument na regulárny výraz jeho odovzdaním konštruktoru RegExp()) a vráti pole obsahujúce výsledky vyhľadávania. Ak je v regulárnom výraze nastavený príznak g, metóda vráti pole všetkých zhôd prítomných v reťazci. Napríklad:

// vráti ["1", "2", "3"] var result = "1 plus 2 sa rovná 3".match(/\d+/g);

Ak regulárny výraz neobsahuje príznak g, metóda match() nevykoná globálne vyhľadávanie; vyzerá to len na prvý zápas. Match() však vracia pole, aj keď metóda nevykonáva globálne vyhľadávanie. V tomto prípade je prvým prvkom poľa nájdený podreťazec a všetky zostávajúce prvky sú podvýrazy regulárneho výrazu. Ak teda match() vráti pole arr, potom arr bude obsahovať celý nájdený reťazec, arr podreťazec zodpovedajúci prvému podvýrazu atď. Ak nakreslíme paralelu s metódou replace(), môžeme povedať, že arr[n] je vyplnené obsahom $n.

Pozrite sa napríklad na nasledujúci kód, ktorý analyzuje adresu URL:

Var url = /(\w+):\/\/([\w.]+)\/(\S*)/; var text = "Navštívte našu stránku http://www..php"; var vysledok = text match(url); if (výsledok != null) ( var fullurl = výsledok; // Obsahuje "http://www..php" var protokol = výsledok; // Obsahuje "http" var hostiteľ = výsledok; // Obsahuje "www..php ")

Všimnite si, že pre regulárny výraz, ktorý nemá nastavený príznak globálneho vyhľadávania g, metóda match() vráti rovnakú hodnotu ako metóda exec() regulárneho výrazu: vrátené pole má vlastnosti indexu a vstupu, ako je popísané v diskusii o exec() nižšie.

Posledná metóda objektu String, ktorá používa regulárne výrazy, je rozdeliť (). Táto metóda rozdeľuje reťazec, na ktorý sa volá, na pole podreťazcov, pričom ako oddeľovač používa argument. Napríklad:

"123 456 789".split(","); // Vráti ["123","456","789"]

Metóda split() môže mať ako argument aj regulárny výraz. Vďaka tomu je metóda výkonnejšia. Môžete napríklad zadať oddeľovač, ktorý umožňuje ľubovoľný počet prázdnych znakov na oboch stranách:

"1, 2, 3, 4, 5".split(/\s*,\s*/); // Vráti ["1","2","3","4","5"]

Objekt regulárneho výrazu

Ako už bolo spomenuté, regulárne výrazy sú reprezentované ako objekty RegExp. Okrem konštruktora RegExp() objekty RegExp podporujú tri metódy a niekoľko vlastností.

Konštruktor RegExp() vezme jeden alebo dva reťazcové argumenty a vytvorí nový objekt RegExp. Prvým argumentom konštruktora je reťazec obsahujúci telo regulárneho výrazu, t.j. text, ktorý sa musí objaviť medzi lomkami v literáli regulárneho výrazu. Všimnite si, že reťazcové literály a regulárne výrazy používajú znak \ na označenie sekvencií escape, takže pri odovzdávaní regulárneho výrazu ako reťazcového literálu do konštruktora RegExp() musíte nahradiť každý znak \ dvojicou znakov \\.

Druhý argument pre RegExp() môže chýbať. Ak je zadaný, špecifikuje príznaky regulárneho výrazu. Musí to byť jeden zo znakov g, i, m alebo kombinácia týchto znakov. Napríklad:

// Nájde všetkých päťciferných čísel v reťazci. Poznámka // použitie \\ znakov v tomto príklade var zipcode = new RegExp("\\d(5)", "g");

Konštruktor RegExp() je užitočný, keď sa regulárny výraz generuje dynamicky, a preto ho nemožno reprezentovať pomocou doslovnej syntaxe regulárneho výrazu. Napríklad, ak chcete nájsť reťazec zadaný používateľom, musíte vytvoriť regulárny výraz v čase spustenia pomocou RegExp().

Vlastnosti regulárneho výrazu

Každý objekt RegExp má päť vlastností. Nehnuteľnosť zdroj- reťazec len na čítanie obsahujúci text regulárneho výrazu. Nehnuteľnosť globálne je boolovská hodnota len na čítanie, ktorá určuje prítomnosť príznaku g v regulárnom výraze. Nehnuteľnosť ignoreCase je boolovská hodnota len na čítanie, ktorá určuje, či je v regulárnom výraze prítomný príznak i. Nehnuteľnosť viacriadkový je boolovská hodnota len na čítanie, ktorá určuje, či je v regulárnom výraze prítomný príznak m. A posledná nehnuteľnosť lastIndex je celé číslo na čítanie/zápis. Pre vzory s príznakom g táto vlastnosť obsahuje číslo pozície v reťazci, na ktorej má začať ďalšie vyhľadávanie. Ako je popísané nižšie, používajú ho metódy exec() a test().

Metódy RegExp

Objekty RegExp definujú dve metódy, ktoré vykonávajú porovnávanie vzorov; správajú sa podobne ako metódy triedy String opísané vyššie. Hlavná metóda triedy RegExp používaná na porovnávanie vzorov je exec(). Je podobná spomínanej metóde match() triedy String, až na to, že ide o metódu triedy RegExp, ktorá berie reťazec ako argument, a nie metódu triedy String, ktorá preberá argument RegExp.

Metóda exec() vykoná regulárny výraz pre zadaný reťazec, t.j. hľadá zhodu v reťazci. Ak sa nenájde žiadna zhoda, metóda vráti hodnotu null. Ak sa však nájde zhoda, vráti rovnaké pole ako pole vrátené metódou match() na vyhľadávanie bez príznaku g. Nulový prvok poľa obsahuje reťazec, ktorý sa zhoduje s regulárnym výrazom, a všetky nasledujúce prvky sú podreťazce, ktoré sa zhodujú so všetkými podvýrazmi. Okrem toho nehnuteľnosť index obsahuje číslo pozície znaku, ktorým začína zodpovedajúci fragment, a vlastnosť vstup odkazuje na hľadaný reťazec.

Na rozdiel od match() metóda exec() vracia pole, ktorého štruktúra nezávisí od prítomnosti príznaku g v regulárnom výraze. Dovoľte mi pripomenúť, že pri odovzdávaní globálneho regulárneho výrazu metóda match() vracia pole nájdených zhôd. A exec() vždy vráti jednu zhodu, ale poskytne o nej úplné informácie. Keď sa exec() zavolá na regulárny výraz, ktorý obsahuje príznak g, metóda nastaví vlastnosť lastIndex objektu regulárneho výrazu na číslo pozície znaku bezprostredne za zhodným podreťazcom.

Keď sa metóda exec() zavolá pre rovnaký regulárny výraz druhýkrát, začne hľadať na pozícii znaku špecifikovanej vo vlastnosti lastIndex. Ak exec() nenájde zhodu, vlastnosť lastIndex sa nastaví na 0. (Aj lastIndex môžete kedykoľvek nastaviť na nulu, čo by ste mali urobiť vo všetkých prípadoch, keď vyhľadávanie skončí skôr, ako sa nájde posledná zhoda v jednom riadku a vyhľadávanie začne na inom reťazci s rovnakým objektom RegExp.) Toto špeciálne správanie umožňuje opakované volanie exec() na opakovanie všetkých zhôd regulárnych výrazov v reťazci. Napríklad:

Varpattern = /Java/g; var text = "JavaScript je zábavnejší ako Java!"; varresult; while((výsledok = vzor.exec(text)) != null) ( console.log("Nájdené "" + výsledok + """ + " na pozícii " + result.index + "; ďalšie vyhľadávanie začne na " + vzor .lastIndex); )

Ďalšia metóda objektu RegExp - test(), čo je oveľa jednoduchšie ako metóda exec(). Trvá reťazec a vráti hodnotu true, ak sa reťazec zhoduje s regulárnym výrazom:

Varpattern = /java/i; pattern.test("JavaScript"); // Vráti hodnotu true

Volanie test() je ekvivalentné volaniu exec(), ktoré vracia hodnotu true, ak exec() vracia hodnotu non-null. Z tohto dôvodu sa metóda test() pri volaní globálneho regulárneho výrazu správa rovnako ako metóda exec(): začne hľadať zadaný reťazec na pozícii určenej vlastnosťou lastIndex a ak nájde zhodu , nastaví vlastnosť lastIndex na číslo pozície znaku priamo po nájdenej zhode. Preto pomocou metódy test() môžete tiež vytvoriť slučku prechodu reťazca, ako je to pri použití metódy exec().

Regex alebo regulárne výrazy sú pre začiatočníkov zastrašujúce, ale pre každého programátora sú nevyhnutné. Poďme pochopiť regulárne výrazy pomocou 5 jednoduchých príkladov JavaScriptu.

Ak máte problém a idete ho riešiť regulárnymi výrazmi, máte dva problémy. Existuje také príslovie. Regulárne výrazy nachádzajúce sa v kóde niekedy spôsobujú strach a nenávisť u ľudí, ktorí ich nepoznajú.

Ale v skutočnosti je každý regulárny výraz len vzorový výraz, ktorý dokáže vyriešiť problém celej funkcie v jednom riadku. Na zostavenie regulárneho výrazu však musíte vziať do úvahy súbor prísnych pravidiel, v ktorých sa začiatočník môže zmiasť a urobiť chyby.

Zodpovedajúce postavy

Najzákladnejšie regulárne výrazy sú tie, ktoré hľadajú zhody jedného znaku. Tu sú ich pravidlá:

1. Bodka (.) zodpovedá ľubovoľnému znaku. Ak chcete hľadať bod, musí byť ukončený znakom "\" (\.).

2. Otáznik (?) znamená, že predchádzajúci znak je voliteľný. Ak chcete hľadať samotný otáznik v reťazci, musí byť tiež ukončený znakom "\" (\?).

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu."; // Postačí „elit“ aj „elat“. Bodka znamená, že to zvládne každý znak. var regex = /el.t/g; console.log(text.match(regex)); // "est" a "lest" sú rovnaké. Otáznik robí „l“ voliteľným. 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.";

// Postačí „elit“ aj „elat“. Bodka znamená, že to zvládne každý znak.

var regex = /el.t/g ;

konzoly. log (text . zápas (regulárny výraz) ) ;

// "est" a "lest" sú rovnaké. Otáznik robí „l“ voliteľným.

var regex2 = /l?est/g ;

konzoly. log (text . match (regex2) ) ;

Zhoda viacerých znakov

Sada je jeden alebo viac znakov uzavretých v zátvorkách, ako napríklad . Takýto výraz bude hľadať iba túto množinu znakov v reťazci – v tomto príklade iba a, b alebo c. Naopak, môžete vyhľadávať výskyty ľubovoľných znakov, s výnimkou symbolu „^“. [^abc] bude zodpovedať akémukoľvek znaku, ktorý nie je a, b alebo c. Môžete tiež zadať rozsah znakov alebo čísel, ako napríklad , .

Existujú vstavané sady znakov, ktoré uľahčujú písanie regulárnych výrazov. Nazývajú sa skratky alebo skratky. Namiesto toho môžete napríklad napísať \D. Existujú skratky pre ostatné znaky (vrátane čísel a podčiarkovníkov) - \w a \W, ako aj pre medzery - \s a \S.

// Postačí iba „mačka“ a „môže“, nie „auto“. var text = "konzerva pre mačky"; console.log(text.match(/ca/g)); // Zodpovedá všetkému okrem cat a can (existuje znak ^) console.log(text.match(/ca[^tn]/g)); // Ďalší príklad, kde len čísla prejdú text = "Chcem 8 šálok kávy, prosím."; console.log("Koľko pohárov: " + text.match(//g)); // Jednoduchší spôsob s \d skratkou console.log("Koľko pohárov: " + text.match(/\d/g)); // Zhoda všetkého okrem čísel console.log(text.match(/\D/g));

// Postačí iba „mačka“ a „môže“, nie „auto“.

var text = "konzerva pre mačky" ;

konzoly. log (text . match (/ca/g ) ) ;

// Odovzdať všetko okrem mačky a plechovky (je prítomný znak ^)

konzoly. log (text . match (/ca[^tn]/g ) );

// Ďalší príklad, kde prejdú iba čísla

text = "Chcel by som 8 šálok kávy, prosím.";

konzoly. log ("Koľko pohárov: " + text . zápas (//g ) ) ;

// Jednoduchší spôsob so skratkou \d

konzoly. log ("Koľko pohárov: " + text . zápas (/\d/g ) ) ;

// Prejde všetko okrem čísel

konzoly. log (text . match (/\D/g ) ) ;

Zhodné slová

Vo väčšine prípadov je potrebné hľadať celé slová, nie jednotlivé znaky. To sa vykonáva pomocou modifikátorov (+) a (-), ktoré opakujú znak alebo skupinu znakov.

Sčítanie (X) určuje presný počet opakovaní, (x, y) rozsah (x a y sú čísla).

Okrem toho existuje špeciálny vzor \b, ktorý zodpovedá hraniciam slov.

var text = "Ahojte ľudia z roku 1974. Pochádzam z budúcnosti. V roku 2014 máme laserové zbrane, vznášacie dosky a žijeme na Mesiaci!"; // Nájdite roky. \d+ sa zhoduje s jedným alebo viacerými znakmi var yearRegex = /\d+/g; console.log("Roky: ", text.match(rokRegex)); // Nájsť všetky ponuky. Naše vety začínajú veľkým písmenom a končia bodkou alebo výkričníkom. var vetaRegex = /.+?(\.|!)/g; console.log("Sentences: ", text.match(sentenceRegex)); // Nájde všetky slová začínajúce na „h“. Môžeme použiť veľké aj malé písmená, takže na definovanie hraníc slov používame modifikátor i // \b. var hWords = /\bh\w+/ig; konzola. log("H Words: ", text. match(hWords)); // Nájdenie všetkých slov medzi 4 a 6 znakmi var findWords = /\b\w(4,6)\b/g; console.log("Slová medzi 4 a 6 znakmi: ", text.match(findWords)); // Nájdenie slov dlhších ako 5 znakov console.log("Slová 5 znakov alebo dlhšie: ", text.match(/\b\w(5,)\b/g)); // Zhoda slov presne 6 znakov dlhá console.log("Slová presne 6 znakov dlhé: ", text.match(/\b\w(6)\b/g));

var text = "Ahojte ľudia z roku 1974. Pochádzam z budúcnosti. V roku 2014 máme laserové zbrane, vznášajúce sa dosky a žijeme na Mesiaci!";

// Nájdite roky. \d+ zodpovedá jednému alebo viacerým znakom

var yearRegex = /\d+/g ;

konzoly. log ("Roky: " , text . zhoda (rokRegex ) ) ;

// Nájsť všetky ponuky. Naše vety začínajú veľkým písmenom a končia bodkou alebo výkričníkom.

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

konzoly. log ("Sentences: " , text . match (sentenceRegex ) ) ;

// Nájde všetky slová začínajúce na „h“. Môžeme použiť veľké aj malé písmená, takže použijeme modifikátor i

// \b na definovanie hranice slova.

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

konzoly. log ("H Words: " , text . match (hWords) ) ;

// Nájdite všetky slová s dĺžkou 4 až 6 znakov

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

konzoly. log( "Slová medzi 4 a 6 znakmi: ", text . zápas (nájsťSlová ) );

// Nájdite slová dlhšie ako 5 znakov

konzoly. log ("Slová 5 znakov alebo dlhšie: " , text . zhoda (/\b\w(5,)\b/g ) ) ;

// Nájdite slová dlhé presne 6 znakov

konzoly. log( "Slová presne 6 znakov dlhé: ", text . zhoda (/\b\w(6)\b/g ) );

Overenie celého radu

V JavaScripte možno takéto výrazy použiť na overenie používateľského vstupu z textových polí. Na overenie reťazca sa používa regulárny regulárny výraz viazaný na začiatok a koniec textového fragmentu, pričom pre tento výraz sa používa výraz ^ (začiatok riadku) a $ (koniec riadku). Tieto symboly zaisťujú, že vzor, ​​ktorý napíšete, pokrýva celú dĺžku textu a nezhoduje sa len s jeho časťou.

Aj v tomto prípade používame metódu test() objektu regulárneho výrazu, ktorá pri kontrole, či sa regulárny výraz zhoduje s reťazcom, vráti hodnotu true alebo false.

// Máme pole reťazcov, poďme nájsť odkazy..com/", "123461", "https://site/?s=google", "http://neplatná adresa URL", "abc http: / /invalid.url/" ]; var regex = /^https?:\/\/[\w\/?.&-=]+$/; var urls = ; for(var i = 0; i< strings.length; i++){ if(regex.test(strings[i])){ // Валидная ссылка urls.push(strings[i]); } } console.log("Valid URLs: ", urls);

// Máme pole reťazcov, poďme nájsť odkazy.

varstrings = [

"https://site/",

"toto nie je adresa URL",

"https://google.com/",

"123461" ,

"https://website/?s=google" ,

"http://nie je platná webová adresa" ,

"abc http://invalid.url/"

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

var url = ;

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

if (regex . test (reťazce [ i ] ) ) (

URL. push(strings[i]);

konzoly. log("Platné adresy URL: " , adresy URL );

Hľadať a nahradiť

Ďalšou bežnou úlohou, ktorá je uľahčená používaním regulárnych výrazov, je hľadanie a nahradenie textu.

Tento článok pokrýval základy používania regulárneho výrazu v JavaScripte.

Úvod

Čo je regulárny výraz?

Regulárny výraz JS je postupnosť znakov, ktorá tvorí pravidlo vyhľadávania. Toto pravidlo možno potom použiť na vyhľadávanie textu, ako aj na jeho nahradenie. V praxi môže regulárny výraz dokonca pozostávať z jedného znaku, ale bežnejšie sú zložitejšie vzorce vyhľadávania.

V Javascripte sú regulárne výrazy tiež objekty. Sú to vzory používané na porovnávanie sekvencií znakov v reťazcoch. Používajú sa v metódach exec() a test() objektu RegExp a v metódach match() , replace() , search a split() objektu String.

Príklad

var vzor = /priklad/i

/priklad/i je regulárny výraz. príkladom je šablóna ( ktoré sa majú použiť pri vyhľadávaní). i je modifikátor označujúci rozlišovanie malých a veľkých písmen.

Príprava regulárneho výrazu

Regulárne výrazy JS pozostávajú zo vzoru a modifikátora. Syntax bude asi takáto:

/vzor/modifikátory;

Šablóna definuje pravidlo vyhľadávania. Pozostáva z jednoduchých znakov ako /abc/ alebo z kombinácie jednoduchých a špeciálnych znakov: /abc/ alebo /Chapter (d+).d/ .

Tabuľka šablón

Modifikátory vám umožňujú robiť dopyty tak, aby sa rozlišovali malé a veľké písmená, boli globálne atď. Používajú sa na vyhľadávanie s rozlišovaním malých a veľkých písmen, ako aj na globálne vyhľadávanie.

Tabuľka modifikátorov


Teraz sme pripravení použiť regulárne výrazy JS. Existujú dva hlavné spôsoby, ako to urobiť: pomocou objektu regulárneho výrazu alebo použitím regulárneho výrazu v reťazci.

Použitie objektu regulárneho výrazu

Vytvorte objekt regulárneho výrazu

Tento objekt popisuje šablónu postavy. Používa sa na porovnávanie vzorov. Existujú dva spôsoby, ako vytvoriť objekt regulárneho výrazu.

Metóda 1: Použitie literálu regulárneho výrazu, ktorý pozostáva zo vzoru uzavretého v lomkách, napríklad:

varreg = /ab+c/;

Literály regulárneho výrazu spúšťajú predkompiláciu regulárneho výrazu pri analýze skriptu. Ak je regulárny výraz konštantný, použite ho na zvýšenie výkonu.

Metóda 2: Volaním funkcie konštruktora objektu RegExp, napríklad:

varreg = new RegExp("ab+c");

Použitie konštruktora vám umožňuje zostaviť regulárny výraz JS v čase skriptu. Túto metódu použite, ak sa regulárny výraz zmení alebo ak predtým nepoznáte vzor. Napríklad, ak dostanete informácie od používateľa, ktorý zadá vyhľadávací dopyt.

Metódy objektu regulárneho výrazu

Zoznámime sa s niekoľkými bežnými metódami objektu regulárneho výrazu:

  • kompilovať() ( zastarané vo verzii 1.5) - zostaví regulárny výraz;
  • exec() - Vykoná zhodu s reťazcom. Vráti prvú zhodu;
  • test() - vykoná zhodu s reťazcom. Vráti true alebo false ;
  • toString() - vráti hodnotu reťazca regulárneho výrazu.

Príklady

Použitie testu ()

Metóda test() je regulárny výraz objektu RegExp. Hľadá reťazec vzoru a vracia hodnotu true alebo false v závislosti od výsledku. Nasledujúci príklad regulárneho výrazu JS ukazuje, ako sa v reťazci hľadá znak „ e”:

varpatt = /e/; patt.test("Najlepšie veci na svete sú zadarmo!");

Keďže tu v rade je „ e“, výsledok tohto kódu bude pravdivý.

Regulárne výrazy vôbec nie je potrebné umiestňovať do premennej. Rovnaký dotaz možno vykonať v jednom riadku:

/e/.test("Najlepšie veci na svete sú zadarmo!");

Použitie exec()

Vyhľadá reťazec podľa daného pravidla vyhľadávania a vráti nájdený text. Ak sa nenašli žiadne zhody, výsledok je null .

Pozrime sa na metódu v akcii pomocou príkladu toho istého symbolu “ e”:

/e/.exec("Najlepšie veci na svete sú zadarmo!");

Keďže riadok obsahuje " e“, výsledkom tohto kódu bude .e.

Použitie regulárneho výrazu na reťazec

V Javascripte možno tieto výrazy použiť aj s dvomi metódami na objekte String: search() a replacement() . Sú potrebné na vyhľadávanie a nahradzovanie v texte.

  • metóda search() – používa výraz na nájdenie zhody a vráti informácie o mieste zhody;
  • Metóda replace() vráti upravený reťazec s nahradenou šablónou.

Príklady

Použitie regulárneho výrazu JS na vyhľadávanie frázy s rozlíšením malých a veľkých písmen “ w3schools" v rade:

varstr = "Navštíviť W3Schools"; var n = str.search(/w3schools/i);

Výsledok v n bude 6.

Metóda vyhľadávania berie ako argument aj reťazec. Argument reťazca sa skonvertuje na regulárny výraz:

Použitie reťazca na vyhľadanie frázy „ školy W3" v rade:

var str = "Navštívte W3Schools!"; varn = str.search("W3Schools");

Použitie regulárneho výrazu JS s rozlišovaním veľkých a malých písmen na nahradenie " Microsoft"na" W3Schools" v rade:

var str = "Navštívte Microsoft!"; var res = str.replace(/microsoft/i, "W3Schools");

Výsledkom je: „Navštívte W3Schools! ".

Metóda replace() tiež akceptuje hľadaný reťazec:

var str = "Navštívte Microsoft!"; var res = str.replace("Microsoft", "W3Schools");

Preklad článku “ Použitie regulárneho výrazu v Javascripte“ pripravil priateľský projektový tím

Syntax regulárnych výrazov je pomerne zložitá a vyžaduje si značné úsilie na učenie. Najlepším sprievodcom regulárnych výrazov sú dnes Regulárne výrazy J. Friedla, ktoré sa slovami autora „učia myslieť v zmysle regulárnych výrazov“.

Základné pojmy

Regulárny výraz- nástroj na spracovanie reťazcov alebo postupnosti znakov, ktorý definuje textovú šablónu.

Modifikátor- slúži na "inštrukciu" regulárneho výrazu.

Metaznaky- špeciálne znaky, ktoré slúžia ako príkazy jazyka regulárnych výrazov.

Regulárny výraz je nastavený ako regulárna premenná, namiesto úvodzoviek sa používa iba lomka, napríklad: var reg=/regexp/

Pod najjednoduchšími šablónami máme na mysli tie šablóny, ktoré nepotrebujú žiadne špeciálne znaky.

Predpokladajme, že našou úlohou je nahradiť všetky písmená „r“ (malé a veľké) latinským veľkým písmenom „R“ vo fráze Regulárne výrazy.

Vytvorte šablónu var reg=/r/ a použitím metódy nahradiť plníme naše plány

V dôsledku toho dostaneme riadok - Regulárne výrazy, k zámene došlo len pri prvom výskyte písmena „r“, pričom sa rozlišujú malé a veľké písmená.

Ale tento výsledok nezodpovedá podmienkam nášho problému... Tu potrebujeme modifikátory„g“ a „i“, ktoré možno použiť samostatne alebo spolu. Tieto modifikátory sú umiestnené na konci vzoru regulárneho výrazu za lomkou a majú nasledujúci význam:

modifikátor"g" - nastaví vyhľadávanie v reťazci ako "globálne", t.j. v našom prípade dôjde k zámene pri všetkých výskytoch písmena „p“. Teraz šablóna vyzerá takto: var reg=/p/g, ktorý ho nahradí do nášho kódu

získať reťazec - Regulárne výrazy.

modifikátor "i".- nastaví vyhľadávanie bez ohľadu na veľkosť písmen pridaním tohto modifikátora do našej šablóny var reg=/p/gi, po vykonaní skriptu dostaneme požadovaný výsledok našej úlohy - Regulárne výrazy.

Špeciálne znaky (metaznaky)

Metaznaky špecifikujú typ znakov hľadaného reťazca, spôsob, akým je hľadaný reťazec obklopený v texte, ako aj počet znakov konkrétneho typu v naskenovanom texte. Preto možno metaznaky rozdeliť do troch skupín:

  • Zodpovedajúce metaznaky.
  • Kvantitatívne metaznaky.
  • Umiestňovanie metaznakov.

Zodpovedajúce metaznaky

Význam

Popis

hranica slova

určuje podmienku, za ktorej sa musí vzor vykonať na začiatku alebo na konci slova

/\ber/ sa zhoduje s chyba, nezhoduje sa s hrdina alebo s hráč
/ehm/ sa zhoduje s hráč, nezhoduje sa s hrdina alebo s chyba
/\ber\b/ nezhoduje sa s hrdina alebo s hráč alebo s chyba, môže sa len zhodovať ehm

ani slovná hranica

určuje podmienku, za ktorej sa vzor nevykoná na začiatku alebo na konci slova

/\ber/ sa zhoduje s hrdina alebo s hráč, nezhoduje sa s chyba
/er\B/ sa zhoduje s chyba alebo s hráč, nezhoduje sa s hrdina
/\Ber\B/ sa zhoduje s hrdina, nezhoduje sa s hráč alebo s chyba

číslica od 0 do 9

/\d\d\d\d/ zodpovedá ľubovoľnému štvorcifernému číslu

/\D\D\D\D/ nezhoduje sa s 2005 alebo 05.g alebo №126 atď.

jeden prázdny znak

sa zhoduje s priestorovým znakom

\over\sbyte\ zápasy iba s cez bajt

jediný neprázdny znak

ktorýkoľvek znak okrem medzery

\over\Sbyte\ sa zhoduje s nad-bajt alebo s over_byte, nezhoduje sa s cez bajt alebo nad--bajt

písmeno, číslo alebo podčiarkovník

/A\w/ sa zhoduje s A1 alebo s AB, nezhoduje sa s A+

nie písmeno, číslo ani podčiarkovník

/A\W/ nezhoduje sa s A1 alebo s AB, sa zhoduje s A+

akúkoľvek postavu

akékoľvek znaky, písmená, čísla atď.

/.../ zodpovedá ľubovoľným trom znakom ABC alebo [chránený e-mailom] alebo 1 q

znakovú sadu

určuje podmienku, za ktorej sa musí vzor vykonať pre akúkoľvek zhodu znakov uzavretých v hranatých zátvorkách

/WERTY/ sa zhoduje s qwerty, od AWERTY

množina neprichádzajúcich znakov

určuje podmienku, za ktorej by sa vzor nemal vykonať pre žiadnu zhodu znakov uzavretých v hranatých zátvorkách

/[^QA]WERTY/ nezhoduje sa s qwerty, od AWERTY

Znaky zobrazené v tabuľke „Metaznaky na priraďovanie“ by sa nemali zamieňať so sekvenciou únikových znakov používaných v reťazcoch, ako napríklad \\t – tabuľka, \\n – nový riadok atď.

Kvantitatívne metaznaky

Množstvo náhod

Nula alebo viackrát

/Ja*script/ sa zhoduje s JavaScript alebo s JavaScript alebo s JavaScript, nezhoduje sa s jovascript

Nula alebo raz

/javascript/ zápasy iba s JavaScript alebo s JavaScript

Jeden alebo viackrát

/javascript/ sa zhoduje s JavaScript alebo s JavaScript alebo s JavaScript, nezhoduje sa s JavaScript

presne n-krát

/Ja(2)script/ zápasy iba s JavaScript

n alebo viackrát

/Ja(2,)script/ sa zhoduje s JavaScript alebo s JavaScript, nezhoduje sa s JavaScript alebo s JavaScript

aspoň n-krát, ale nie viac ako m-krát

/Ja(2,3)script/ zápasy iba s JavaScript alebo s JavaScript

Každý znak uvedený v tabuľke Kvantitatívne metaznaky sa vzťahuje na jeden predchádzajúci znak alebo metaznak v regulárnom výraze.

Polohovacie metaznaky

Posledná skupina metaznakov je určená na označenie, kde hľadať (ak je to dôležité) podreťazec na začiatku alebo na konci reťazca.

Niektoré metódy práce so šablónami

nahradiť- túto metódu sme už použili na samom začiatku článku, je určená na vyhľadanie vzorky a nahradenie nájdeného podreťazca novým podreťazcom.

exec- táto metóda vykonáva porovnávanie reťazcov so vzorom daným vzorom. Ak zhoda vzoru zlyhá, vráti sa hodnota null. V opačnom prípade je výsledkom pole podreťazcov, ktoré zodpovedajú danému vzoru. /*Prvý prvok poľa sa bude rovnať pôvodnému reťazcu, ktorý vyhovuje danému vzoru*/

napríklad:

ako výsledok dostaneme štyri riadky:
Dátum narodenia: 15.09.1980
narodeniny: 15
Mesiac narodenia: 09
Rok narodenia: 1980

Záver

Článok neukazuje všetky vlastnosti a kúzla regulárnych výrazov, pre hlbšie štúdium tejto problematiky vám odporúčam preštudovať si objekt RegExp. Chcem tiež upozorniť na skutočnosť, že syntax regulárnych výrazov sa v JavaScripte aj v PHP nelíši. Napríklad na kontrolu správnosti zadania e-mailu, regulárneho výrazu, čo pre JavaScript, čo pre PHP bude vyzerať rovnako /[chránený e-mailom]+.(2,3)/i.