Kontrola regulárních výrazů v JavaScriptu. Regulární výrazy

Regex nebo regulární výrazy jsou pro začátečníky zastrašující, ale pro každého programátora jsou nezbytné. Pojďme pochopit regulární výrazy pomocí 5 jednoduchých příkladů s JavaScriptem.

Pokud máte problém a hodláte ho vyřešit regulárními výrazy, máte nyní dva problémy. Existuje rčení. Regulární výrazy nalezené v kódu někdy vyvolávají strach a nenávist u lidí, kteří je neznají.

Ale ve skutečnosti je jakýkoli regulární výraz pouze šablonovým výrazem, který dokáže vyřešit problém celé funkce na jednom řádku. Chcete-li však sestavit regulární výraz, musíte vzít v úvahu soubor přísných pravidel, ve kterých se začátečník může splést a udělat chyby.

Odpovídající postavy

Nejzákladnější regulární výrazy jsou ty, které odpovídají jednotlivým znakům. Zde jsou jejich pravidla:

1. Tečka (.) odpovídá libovolnému znaku. Pokud potřebujete vyhledat konkrétní bod, musíte jej opustit znakem „\“ (\.).

2. Otazník (?) označuje, že předchozí znak je volitelný. Chcete-li vyhledat otazník samotný v řetězci, musí být také escapován pomocí "\" (\?).

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu."; // Postačí „elit“ i „elat“. Tečka znamená, že se hodí jakýkoli symbol. var regex = /el.t/g; console.log(text.match(regulární výraz)); // "est" a "lest" budou fungovat stejně dobře. Otazník činí "l" volitelným. var regex2 = /l?est/g; console.log(text.match(regulární výraz2));

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

// Postačí „elit“ i „elat“. Tečka znamená, že se hodí jakýkoli symbol.

var regex = /el.t/g ;

řídicí panel. log(text. shoda(regulární výraz));

// "est" a "lest" budou fungovat stejně dobře. Otazník činí "l" volitelným.

var regex2 = /l?est/g ;

řídicí panel. log(text. shoda(regulární výraz2));

Spojte více znaků

Sada je jeden nebo více znaků uzavřených v závorkách, například . Tento výraz bude hledat pouze tuto sadu znaků v řetězci – v tomto příkladu pouze a, b nebo c. Naopak můžete vyhledávat výskyty libovolných symbolů kromě použití symbolu „^“. [^abc] bude odpovídat libovolnému znaku, který není a, b nebo c. Můžete také zadat rozsah znaků nebo čísel, například , .

Existují vestavěné znakové sady, které usnadňují psaní regulárních výrazů. Říká se jim zkratky nebo těsnopis. Místo toho můžete například napsat \D. Existují zkratky pro další znaky (včetně čísel a podtržítek) - \w a \W, stejně jako pro mezery - \s a \S.

// Fungovat bude pouze "kočka" a "can", nikoli "auto". var text = "kočičí konzerva"; console.log(text.match(/ca/g)); // Projde vše kromě cat a can (je tam symbol ^) console.log(text.match(/ca[^tn]/g)); // Další příklad, kdy projdou pouze čísla text = "Chtěl bych 8 šálků kávy, prosím."; console.log("Kolik šálků: " + text.match(//g)); // Jednodušší způsob pomocí zkratky \d console.log("Kolik šálků: " + text.match(/\d/g)); // Předá vše kromě čísel console.log(text.match(/\D/g));

// Fungovat bude pouze "kočka" a "can", nikoli "auto".

var text = "kočičí konzerva" ;

řídicí panel. log(text. shoda(/ca/g));

// Projde vše kromě kočky a plechovky (je tam symbol ^)

řídicí panel. log (text . shoda (/ca[^tn]/g ) ) ;

// Další příklad, kdy projdou pouze čísla

text = "Chtěl bych 8 šálků kávy, prosím.";

řídicí panel. log ("Kolik šálků: " + text . shoda (//g) ) ;

// Jednodušší způsob pomocí zkratky \d

řídicí panel. log("Kolik kelímků: " + text . shoda (/\d/g ) );

// Projde vše kromě čísel

řídicí panel. log(text. shoda(/\D/g));

Odpovídající slova

Ve většině případů je potřeba hledat celá slova, nikoli jednotlivé znaky. To se provádí pomocí modifikátorů (+) a (-), které opakují znak nebo sadu znaků.

Sčítání (X) udává přesný počet opakování, (x, y) – rozsah (x a y jsou čísla).

Navíc existuje speciální vzor \b, který odpovídá hranicím na koncích slov.

var text = "Ahoj lidé z roku 1974. Přicházím z budoucnosti. V roce 2014 máme laserová děla, vznášedla a žijeme na Měsíci!"; // Najde roky. \d+ bude odpovídat jednomu nebo více znakům var yearRegex = /\d+/g; console.log("Roky: ", text.match(rokRegex)); // Najde všechny věty. Naše věty začínají velkým písmenem a končí tečkou nebo vykřičníkem. var větaRegex = /.+?(\.|!)/g; console.log("Sentences: ", text.match(sentenceRegex)); // Najde všechna slova začínající na "h". Vyhovují nám velká i malá písmena, proto k definici hranice slova používáme modifikátor i // \b. var hWords = /\bh\w+/ig; console.log("H Slova: ", text.match(hWords)); // Najde všechna slova od 4 do 6 znaků var findWords = /\b\w(4,6)\b/g; console.log("Slova mezi 4 a 6 znaky: ", text.match(findWords)); // Hledání slov delších než 5 znaků console.log("Slova 5 znaků nebo delší: ", text.match(/\b\w(5,)\b/g)); // Najde slova dlouhá přesně 6 znaků console.log("Slova přesně 6 znaků dlouhá: ", text.match(/\b\w(6)\b/g));

var text = "Ahoj lidé z roku 1974. Pocházím z budoucnosti. V roce 2014 máme laserová děla, vznášedla a žijeme na Měsíci!";

// Najde roky. \d+ odpovídá jednomu nebo více znakům

var yearRegex = /\d+/g ;

řídicí panel. log ( "Roky: " , text . shoda ( rokRegex ) ) ;

// Najde všechny věty. Naše věty začínají velkým písmenem a končí tečkou nebo vykřičníkem.

var větaRegex = /.+?(\.|!)/g ;

řídicí panel. log("Sentences: ", text. match(sentenceRegex));

// Najde všechna slova začínající na "h". Vyhovují nám velká i malá písmena, proto používáme modifikátor i

// \b k určení hranic slov.

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

řídicí panel. log ( "H Slova: " , text . shoda ( hWords ) );

// Najde všechna slova od 4 do 6 znaků

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

řídicí panel. log( "Slova mezi 4 a 6 znaky: ", text . match(findWords));

// Hledání slov delších než 5 znaků

řídicí panel. log ("Slova 5 znaků nebo delší: " , text . shoda (/\b\w(5,)\b/g ) ) ;

// Najděte slova dlouhá přesně 6 znaků

řídicí panel. log( "Slova přesně 6 znaků dlouhá: ", text . shoda (/\b\w(6)\b/g ) );

Ověření celého řetězce

V JavaScriptu lze takové výrazy použít k ověření uživatelského vstupu z textových polí. K ověření řetězců se používá regulární regulární výraz svázaný se začátkem a koncem textového fragmentu, přičemž se pro tento účel používají výrazy ^ (začátek řádku) a $ (konec řádku). Tyto symboly zajistí, že vzor, ​​který napíšete, bude pokrývat celou délku textu, a nikoli pouze jeho část.

V tomto případě navíc používáme metodu test() objektu regulárního výrazu, která při testování, zda regulární výraz odpovídá řetězci, vrací hodnotu true nebo false.

// Máme pole řetězců, pojďme najít odkazy..com/", "123461", "https://site/?s=google", "http://není platná 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 řetězců, pojďme najít odkazy.

var strings = [

"https://site/",

"toto není URL" ,

"https://google.com/",

"123461" ,

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

"http://není platná adresa URL" ,

"abc http://invalid.url/"

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

var url = ;

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

if (regulární výraz . test (řetězce [ i ] ) ) (

adresy URL. push(strings[i]);

řídicí panel. log("Platné adresy URL: ", adresy URL);

Hledat a nahradit

Dalším běžným úkolem, který je usnadněn používáním regulárních výrazů, je hledání a nahrazování textu.

Třída RegExp v JavaScriptu je regulární výraz – objekt, který popisuje vzor znaků. Objekty RegExp se obvykle vytvářejí pomocí speciální doslovné syntaxe uvedené níže, ale lze je vytvořit také pomocí konstruktoru RegExp().

Syntax

// pomocí speciální doslovné syntaxe var regex = /pattern /flags ; // pomocí konstruktoru var regex = new RegExp("vzor", "příznaky"); var regex = new RegExp(/vzor /, "flags");

Hodnoty parametrů:

Příznaky regulárního výrazu

VlajkaPopis
GUmožňuje vám najít všechny shody namísto zastavení po první shodě ( globální zápas vlajky).
iUmožňuje shodu bez rozlišení velkých a malých písmen ( ignorovat příznak případu).
mPárování se provádí ve více řádcích. Úvodní a koncové znaky (^ a $) se zpracovávají na více řádcích, což znamená, že ke shodě dochází na začátku nebo na konci každého řádku (oddělovače \n nebo \r), a nikoli pouze na začátku nebo konci celého řádku ( víceřádkový příznak).
uVzor bude interpretován jako sekvence bodů kódu Unicode ( unicode vlajka).
yKe shodě dochází u indexu, na který ukazuje vlastnost lastIndex tohoto regulárního výrazu, zatímco shoda se neprovádí na pozdějším nebo dřívějším indexu ( lepkavá vlajka).

Znakové sady

Metaznaky

SymbolPopis
. Umožňuje vám najít jeden znak jiný než nový řádek nebo znak konce řádku (\n, \r, \u2028 nebo \u2029).
\dUmožňuje najít číselný symbol v základní latinské abecedě. Ekvivalent použití znakové sady.
\DUmožňuje najít jakýkoli znak, který není číslem v základní latinské abecedě. Ekvivalentní znakové sadě [^0-9].
\sUmožňuje vám najít jeden prázdný znak. Mezery se týkají mezery, tabulátoru, odřádkování, odřádkování a dalších mezer Unicode. Ekvivalent znakové sady [\f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2009 u200a​ \u2028\u2029​\u202f\u205f​\u3000].
\SUmožňuje vám najít jeden znak, který není prázdný. Mezery se týkají mezery, tabulátoru, odřádkování, odřádkování a dalších mezer Unicode. Ekvivalent znakové sady [^ \f\n\r\t\v​\u00a0\u1680​\u180e\u2000​\u2001\u2002​\u2003\u2004​\u2005\u2006​\u2007\u2009 \u200a ​\u2028\u2029​\u202f\u205f​\u3000].
[\b]Umožňuje najít znak backspace (speciální znak \b, U+0008).
\0 Umožňuje najít symbol 0 (nula).
\nUmožňuje vám najít znak nového řádku.
\FUmožňuje vám najít znak zdroje stránky.
\rUmožňuje najít znak návratu vozíku.
\tUmožňuje najít vodorovný znak tabulátoru.
\protiUmožňuje najít svislý znak tabulátoru.
\wUmožňuje najít jakýkoli alfanumerický znak v základní latinské abecedě včetně podtržítek. Ekvivalentní znakové sadě.
\WUmožňuje najít jakýkoli znak, který není znakem ze základní latinské abecedy. Ekvivalentní znakové sadě [^a-Za-z0-9_].
\cXUmožňuje najít řídicí znak v řetězci. Kde X je písmeno od A do Z. Například /\cM/ představuje znak Ctrl-M.
\xhhUmožňuje najít znak pomocí hexadecimální hodnoty (hh je dvoumístná hexadecimální hodnota).
\uhhhhUmožňuje najít znak pomocí kódování UTF-16 (hhhh je čtyřmístná hexadecimální hodnota).
\u(hhhh) nebo
\u(hhhhh)
Umožňuje vám najít znak s hodnotou Unicode U+hhhh nebo U+hhhhh (hexadecimální hodnota). Pouze když je uveden příznak u.
\ Označuje, že následující znak je speciální a neměl by být vykládán doslovně. U znaků, které jsou obvykle interpretovány zvláštním způsobem, určuje, že následující znak není speciální a měl by být interpretován doslovně.

Omezení

Kvantifikátory

SymbolPopis
n*Ke shodě dojde u libovolného řetězce obsahujícího žádný nebo více výskytů znaku n.
n+Ke shodě dochází s jakýmkoli řetězcem obsahujícím alespoň jeden znak n.
n?Ke shodě dojde u libovolného řetězce s předchozím prvkem n nula nebo jednou.
n(x)Odpovídá libovolnému řetězci obsahujícímu posloupnost znaků n určitý počet krát X. X
n(x,) X výskyty předchozího prvku n. X musí být kladné celé číslo.
n(x, y)Odpovídá libovolnému řetězci obsahujícímu alespoň X, ale ne více než s y výskyty předchozího prvku n. X A y musí být kladná celá čísla.
n*?
n+?
n??
n(x)?
n(x,)?
n(x,y)?
Srovnání probíhá analogicky s kvantifikátory *, +, ? a (...), hledá se však minimální možné srovnání. Výchozí nastavení je "chamtivý" režim, ? na konci kvantifikátoru umožňuje nastavit „non-chamtivý“ režim, ve kterém se porovnání opakuje co nejméně.
x(?=y)Umožňuje porovnávat X, pouze pokud pro X by měl y.
x(?!y)Umožňuje porovnávat X, pouze pokud pro X nedělej to y.
x|yK porovnání dochází s kteroukoli ze zadaných alternativ.

Seskupování a zpětné odkazy

SymbolPopis
(X)Umožňuje najít symbol X a zapamatujte si výsledek porovnání ("zachycení závorek"). Odpovídající podřetězec lze volat z výsledných prvků pole ..., [n] nebo z vlastností předdefinovaného objektu RegExp $1 ..., $9.
(?:X)Umožňuje najít symbol X, ale nepamatuje si výsledek zápasu ("nezachycující závorky"). Odpovídající podřetězec nelze volat z výsledných prvků pole ..., [n] nebo z vlastností předdefinovaného objektu RegExp $1 ..., $9.
\nNávratový odkaz na poslední podřetězec, který se shoduje s n-tým v závorkách v regulárním výrazu (číslování závorek jde zleva doprava). n musí být kladné celé číslo.

Regulární výraz je objekt, který popisuje vzor znaků. Třída RegExp v JavaScriptu představuje regulární výrazy a objekty tříd String a RegExp definují metody, které používají regulární výrazy k provádění porovnávání vzorů a vyhledávání a nahrazování textu.

Regulární výrazy jsou mocným nástrojem pro zpracování příchozích dat. Úkol, který vyžaduje nahrazení nebo prohledání textu, lze krásně vyřešit pomocí tohoto „jazyka v jazyce“.

Stvoření

V JavaScriptu jsou regulární výrazy reprezentovány objekty RegExp. Objekty RegExp lze vytvořit pomocí konstruktoru RegExp(), ale častěji jsou vytvořeny pomocí speciální doslovné syntaxe. Způsoby tvorby:

// Použití literálu regulárního výrazu: var re = /ab+c/;

Literály regulárního výrazu způsobí, že regulární výraz je předkompilován, když je skript analyzován.

// Volání konstruktoru funkce objektu RegExp var re = new RegExp("ab+c");

Použití konstruktoru znamená kompilaci regulárního výrazu během provádění skriptu. Tato metoda by měla být použita, pokud je známo, že se výraz změní.

Speciální znaky v regulárním výrazu

\ – Pro běžné postavy – dělá je speciálními. Například výraz /s/ jednoduše hledá znak 's'. A pokud vložíte \ před s, pak /\s/ již označuje znak mezery.

^ – Označuje začátek vstupních dat. Pokud je nastaven příznak víceřádkového vyhledávání („m“), bude fungovat také na začátku nového řádku.

$ – Označuje konec vstupních dat. Pokud je nastaven příznak víceřádkového vyhledávání, bude fungovat i na konci řádku.

* – Označuje opakování 0 nebo vícekrát. Například /bo*/ najde „boooo“ v „Duch booood“ a „b“ v „Pták zavrčel“, ale nenajde nic v „Zachroptěla koza“.

+ – Označuje opakování 1 nebo vícekrát. Ekvivalent k (1,). Například /a+/ bude odpovídat „a“ v „cukroví“ a všem „a“ v „caaaaaaandy“.

? – Označuje, že prvek může nebo nemusí být přítomen.

. – (Desetinná čárka) představuje jakýkoli znak jiný než nový řádek: \n \r \u2028 nebo \u2029. (můžete použít [\s\S] k vyhledání libovolného znaku, včetně nových řádků).

(X)– Najde x a zapamatuje si. Tomu se říká „paměťové závorky“. Například /(foo)/ najde a zapamatuje si „foo“ v „foo baru“. Nalezený podřetězec je uložen v poli výsledků hledání nebo v předdefinovaných vlastnostech objektu RegExp: $1, ..., $9.

(?:X)– Najde x, ale nepamatuje si, co najde. Tomu se říká „nepamatovat si závorky“. Nalezený podřetězec není uložen ve vlastnostech pole výsledků a RegExp. Jako všechny závorky spojují to, co je v nich, do jediného podvzoru.

x(?=y)– Najde x, pouze pokud za x následuje y. Například /Jack(?=Sprat)/ bude odpovídat 'Jack' pouze v případě, že bude následovat 'Sprat'. /Jack(?=Sprat|Frost)/ najde 'Jack' pouze v případě, že za ním následuje 'Sprat' nebo 'Frost'. Ve výsledku vyhledávání se však neobjeví ani 'Sprat' ani 'Frost'.

x(?!y)– Najde x pouze tehdy, pokud za x nenásleduje y. Například /\d+(?!\.)/ bude odpovídat číslu pouze v případě, že za ním nenásleduje desetinná čárka. /\d+(?!\.)/.exec(“3.141”) najde 141, ale ne 3,141.

x|y– Najde x nebo y. Například /zelená|červená/ bude odpovídat „zelené“ v „zeleném jablku“ a „červené“ v „červeném jablku“.

(n)– Kladné celé číslo. Najde přesně n opakování předchozího prvku.

(n,)– Kladné celé číslo. Najde n nebo více opakování prvku.

(n, m)– Kladná celá čísla. Najděte od n do m opakování prvku.

- Sada znaků. Najde některý z uvedených znaků. Mezeru můžete označit pomocí pomlčky. Například - totéž jako .

[^xyz]– Jakýkoli jiný znak, než který je uveden v sadě. Můžete také určit rozpětí. Například [^abc] je totéž jako [^a-c].

[\b]– Vyhledá znak backspace.

\b– Najde hranice slov (lat.).

\B– Neoznačuje hranici slova. Například /\w\Bn/ bude odpovídat „on“ v „poledne“ a /y\B\w/ bude odpovídat „ye“ v „možná včera“.

\cX– X je písmeno od A do Z. Označuje řídicí znak v řetězci. Například /\cM/ představuje znak Ctrl-M.

\d– Najde číslo z libovolné abecedy.

\D– Vyhledá nečíselný znak (všechny abecedy). [^0-9] je ekvivalent pro běžná čísla.

\f,\r,\n– Odpovídající speciální znaky form-feed, line-feed, line feed.

\s– Najde jakýkoli znak mezery, včetně mezery, tabulátoru, nového řádku a dalších mezer Unicode.

\S– Najde jakýkoli znak kromě mezer.

\t– Znak tabulátoru.

\proti– Svislý tabulátor.

\w– Najde jakýkoli (latinský) znak slova, včetně písmen, číslic a podtržítek. Ekvivalent.

\W– Najde jakýkoli (jiný než latinský) slovní symbol. Ekvivalentní [^A-Za-z0-9_].

\0 – Vyhledá znak NUL.

\xhh– Vyhledá znak s kódem hh (2 hexadecimální číslice).

\uhhhh– Vyhledá znak s kódem hhhh (4 hexadecimální číslice).

Vlajky

Příznaky regulárních výrazů určují pravidla pro porovnávání vzorů na vysoké úrovni. Na rozdíl od zbytku gramatiky regulárních výrazů nejsou příznaky specifikovány mezi znaky lomítka, ale za druhým. JavaScript podporuje tři příznaky.

Vlajka i označuje, že vyhledávání vzoru by mělo nerozlišovat malá a velká písmena, a příznak G– že vyhledávání má být globální, tzn. musí být nalezeny všechny shody v řetězci. Vlajka m provádí vyhledávání vzoru ve víceřádkovém režimu. Pokud hledaný řetězcový výraz obsahuje nové řádky, pak v tomto režimu kotevní znaky ^ a $, kromě toho, že odpovídají začátku a konci celého řetězcového výrazu, odpovídají také začátku a konci každého textového řádku. Vlajky lze kombinovat v libovolné kombinaci.

Metody řetězcových tříd

Řetězce podporují čtyři metody využívající regulární výrazy.

metoda search().

Vezme regulární výraz jako argument a vrátí buď pozici prvního znaku shodného podřetězce, nebo -1, pokud není nalezena žádná shoda. Například následující volání vrátí 4:

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

Pokud argument metody search() není regulární výraz, je nejprve převeden předáním konstruktoru RegExp. Metoda search() nepodporuje globální vyhledávání a ignoruje příznak G ve vaší argumentaci.

metoda nahradit().

Provede operaci hledání a nahrazení. Jako první argument bere regulární výraz a jako druhý náhradní řetězec. Metoda hledá na řádku, na kterém je volána, shodu se zadaným vzorem. Pokud regulární výraz obsahuje příznak g, metoda replace() nahradí všechny nalezené shody náhradním řetězcem. V opačném případě nahradí pouze první nalezenou shodu.

metoda match().

Vezme regulární výraz jako svůj jediný argument (nebo převede svůj argument na regulární výraz předáním konstruktoru RegExp()) a vrátí pole obsahující výsledky hledání. Pokud je v regulárním výrazu nastaven příznak g, metoda vrátí pole všech shod přítomných v řetězci. Například:

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

Pokud regulární výraz neobsahuje příznak g, metoda match() neprovede globální vyhledávání; prostě to vypadá na první zápas. Match() však vrací pole, i když metoda neprovádí globální vyhledávání. V tomto případě je prvním prvkem pole nalezený podřetězec a všechny zbývající prvky jsou podvýrazy regulárního výrazu.

metoda split().

Tato metoda rozdělí řetězec, na kterém je volána, na pole podřetězců, přičemž jako oddělovač použije argument. Například:

"123,456,789".split(","); // Návrat ["123","456","789"]

Metoda split() může také použít regulární výraz jako argument. Díky tomu je metoda výkonnější.

RegExp objekt

Konstruktor RegExp() vezme jeden nebo dva řetězcové argumenty a vytvoří nový objekt RegExp. Prvním argumentem konstruktoru je řetězec obsahující tělo regulárního výrazu, tzn. text, který se musí objevit mezi znaky lomítka v literálu regulárního výrazu. Druhý argument pro RegExp() může chybět. Pokud je zadán, definuje příznaky regulárního výrazu. Musí to být jedna z postav g, i, m nebo kombinace těchto symbolů.

Vlastnosti RegExp

Každý objekt RegExp má pět vlastností:

  • zdroj– řetězec pouze pro čtení obsahující text regulárního výrazu.
  • globální– logická hodnota pouze pro čtení, která určuje přítomnost příznaku G v regulárním výrazu.
  • ignorovat případ i v regulárním výrazu.
  • víceřádkový je booleovská hodnota pouze pro čtení, která určuje, zda je příznak přítomen m v regulárním výrazu.
  • lastIndex je celé číslo, které lze číst a zapisovat. Pro šablony s příznakem G tato vlastnost obsahuje číslo pozice v řádku, na kterém by mělo začít další hledání.

Metody RegExp

Objekty RegExp definují dvě metody, které provádějí porovnávání vzorů.

metoda exec().

Metoda exec() provede regulární výraz pro zadaný řetězec, tzn. hledá shodu v řetězci. Pokud není nalezena žádná shoda, metoda vrátí hodnotu null. Pokud je však nalezena shoda, vrátí stejné pole jako pole vrácené metodou match() pro vyhledávání bez příznaku G.

Nulový prvek pole obsahuje řetězec, který odpovídá regulárnímu výrazu, a všechny následující prvky obsahují podřetězce, které odpovídají všem podvýrazům. Na rozdíl od match() metoda exec() vrací pole, jehož struktura nezávisí na přítomnosti příznaku v regulárním výrazu. G.

Když je exec() voláno podruhé na stejném regulárním výrazu, začne hledání u znaku, jehož pozice je určena ve vlastnosti lastIndex. Pokud exec() nenajde shodu, vlastnost lastIndex je nastavena na 0.

testovací metoda

Vezme řetězec a vrátí hodnotu true, pokud řetězec odpovídá regulárnímu výrazu:

Vzor Var = /java/i; pattern.test("JavaScript"); // Návrat true

Volání test() je ekvivalentní volání exec(), které vrátí hodnotu true, pokud exec() vrátí něco jiného než null. Z tohoto důvodu se metoda test() při volání globálního regulárního výrazu chová stejně jako metoda exec(): začne hledat zadaný řetězec na pozici určené vlastností lastIndex, a pokud najde shodu , nastaví vlastnost lastIndex na číslo pozice znaku přímo vedle nalezené shody.

Psaní šablony

Vzor regulárního výrazu se skládá z regulárních znaků, jako je /abc/, nebo kombinací běžných a speciálních znaků, jako je /ab*c/ nebo /Kapitola (\d+)\.\d*/. Poslední příklad zahrnuje závorky, které se používají jako „mechanismus paměti“. Shoda této části šablony je zapamatována pro budoucí použití.

Použití jednoduchých šablon

Jednoduché vzory se používají k nalezení přímých shod v textu. Například vzor /abc/ odpovídá kombinaci znaků v řetězci pouze tehdy, když se znaky 'abc' objevují společně a ve stejném pořadí.

Téma regulárních výrazů je poměrně obsáhlé a nelze jej obsáhnout v jedné lekci, ale účelem našich lekcí je poskytnout vám základní pochopení jazyka javascript a jeho možností, proto není možné regulární výrazy ignorovat.

Nejprve pojďme zjistit, co to je.
Regulární výraz- toto je instrukce, která popisuje ve speciálně vyvinutém jazyce (RegExp) zákon „podobnosti“ požadovaného řetězce se vzorem.

K čemu to je? Například:

  • Uspořádat hledání něčeho v textu.
  • Nahrazení jedné části podřetězců jinými.
  • Chcete-li zkontrolovat správnost zadání uživatele (pravděpodobně jste se nejednou setkali se situací, kdy jste zadali svou e-mailovou adresu do nějakého formuláře a zobrazila se chyba jako "Neplatný e-mail").

Nebudeme zabíhat do podrobností, ale podívejme se, jak nastavit regulární výrazy. Existují dva způsoby, v této lekci se podíváme na jeden (tvorba v doslovném zápisu):

Var p=/pattern/flags;

Kde
vzor- vzor je základem regulárního výrazu, který definuje kritéria pro shodu řetězců. Skládá se z literálů a metaznaků.
vlajky- příznaky (modifikátory), které specifikují další parametry shody šablony.

Var par=/+/i;

Tady + - šablona, ​​doslova znamená následující „libovolný počet čísel a písmen 1 nebo vícekrát“ (jak nastavit šablonu uvidíme níže).

i

Aby bylo jasnější, o čem mluvíme, podívejme se na příklad. Předpokládejme, že máme formulář, kam uživatel zadá svůj email a heslo. Chceme, aby se po kliknutí na tlačítko „Registrovat“ zkontrolovala správnost zadání.

Kód stránky HTML bude následující:

Regulární výrazy Javascriptu

Registrační formulář



Co by tedy funkce měla dělat? prov_address()? Pro začátek potřebujeme dvě proměnné, do kterých umístíme hodnoty zadané uživatelem:

funkce prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; )

Nyní je potřeba nastavit vzory (regulární výrazy), se kterými budeme porovnávat, co uživatel zadal. Tady je dám, promluvíme si o tom, jak je skládat později:

funkce prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; var adr_pattern=/+@+\.(2,5)/i; var par_pattern=/+/i; )

Nyní zkontrolujeme shodu vzorů. K tomu použijeme metodu test objekt RegExp:

function prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; var adr_pattern=/+@+\.(2,5)/i; var par_pattern=/+/i; var prov=vzor_adr.test(adr) var prov1=vzor_par.test(par);

Čára adr_pattern.test(adr) znamená následující: kontrola existence v řetězci adr sekvence odpovídající regulárnímu výrazu adr_pattern. Metoda test vrátí booleovskou hodnotu (true nebo false).

Jediné, co musíme udělat, je v naší funkci uvést, co dělat v případě úspěšné (nebo neúspěšné) kontroly:

function prov_adress(obj) ( var adr=obj.mail.value; var par=obj.pas.value; var adr_pattern=/+@+\.(2,5)/i; var par_pattern=/+/i; var prov=adr_pattern.test(adr var prov1=par_pattern.test(par); if (prov==pravda && prov1==pravda) ( ​​alert("Jste zaregistrován!"); ) else ( alert("); Zadané údaje jsou nesprávné !"); ) )

Hotovo, doufám, že chápete podstatu toho, co děláme. Než ale zkontrolujeme fungování našeho skriptu, podívejme se, z čeho se naše regulární výrazy skládají.

Vezměme si regulární výraz pro naše heslo - /+/i:

  • /+/ - šablonu, ve které:
    • 0-9 - jakékoliv číslo.

    • a-z- libovolné malé písmeno od a do z.

    • - hranaté závorky znamenají, že vzor může obsahovat libovolný z literálů v nich uvedených (v našem případě čísla a malá písmena)

    • + - označuje, že tato část vzoru (tj. to, co je v hranatých závorkách) se může jednou nebo vícekrát opakovat.


  • i- příznak označující, že na velikosti písmen nezáleží.

Jinými slovy, náš regulární výraz určuje, že heslo může obsahovat libovolný počet číslic a písmen 1 nebo vícekrát (tj. může se skládat z jednoho čísla, jednoho písmene, mnoha číslic, mnoha písmen, číslic a písmen) .

Pokud například uživatel zadá do pole hesla „2“, „a3b“ nebo „leopard“, bude takové heslo považováno za správné. A pokud zadá „ab&s“ nebo „24?“, pak takové heslo nebude považováno za správné, protože obsahuje speciální znaky a my jsme je v regulárním výrazu nepovolili.

Doufám, že už je jasné, jak a proč můžete regulární výrazy používat, zbývá se jen naučit principy jejich skládání. Přísně vzato, úkol sestavit regulární výraz spočívá ve vytvoření jeho šablony. A šablona, ​​jak si pamatujete, se může skládat z literálů a metaznaků.

Začněme tím nejjednodušším - doslovy:

  • Každý z těchto symbolů představuje sám sebe. Například /abc/ - tomuto vzoru odpovídá pouze řetězec "abc".

  • a-z- všechna malá písmena od a do z. Například /a-z/ - tento vzor odpovídá 26 řetězcům: "a", "b", "c"... "z"

  • A-Z- všechna velká písmena od A do Z.

  • 0-9 - všechna čísla.

Pokud chceme naznačit, že může existovat několik čísel nebo písmen, budeme muset použít řídicí znaky:
  • * - označuje, že znak (nebo část vzoru, pokud je uzavřen v hranatých závorkách) se může opakovat 0 nebo vícekrát. Například /ab*c/ - znamená, že řádek začíná znakem a, poté může být libovolný počet znaků b, následovaný znakem c. Tito. mohou to být například následující řetězce: "ac", "abc", "abbbbbbc" atd.

  • + - označuje, že znak (nebo část vzoru, je-li uzavřen v hranatých závorkách) lze opakovat 1 nebo vícekrát. Například /ab+c/ - znamená, že řádek začíná znakem a, poté může být libovolný počet znaků b (ale ne méně než 1), následovaný znakem c. Tito. mohou to být například následující řetězce: "abc", "abbbbbbc" atd.

  • . - označuje, že toto místo může obsahovat libovolný jednotlivý znak kromě znaku nového řádku. Například pro vzor /ab.c/ jsou srovnatelné následující řetězce: "ab6c", "abxc", "ab=c" atd.

  • ? - označuje, že znak (nebo část vzoru, pokud je uzavřen v hranatých závorkách) se může opakovat 0 nebo 1krát. Například /ab?c/ - znamená, že řádek začíná znakem a, poté může, ale nemusí být jeden znak b, následovaný znakem c. Tito. mohou to být následující řetězce: "ac", "abc"

  • (n)- označuje, že znak (nebo část vzoru, pokud je uzavřen v hranatých závorkách) se může opakovat přesně nkrát. Například /ab(3)c/ - znamená, že řádek začíná znakem a, pak jsou zde 3 znaky b, následované znakem c. Tito. to bude řetězec "abbbc".

  • (n,)- označuje, že znak (nebo část vzoru, pokud je uzavřen v hranatých závorkách) se může n nebo vícekrát opakovat. Například /ab(3,)c/ - znamená, že řádek začíná znakem a, pak jsou 3 nebo více znaků b, následuje znak c. Tito. mohou to být následující řetězce: "abbbc", "abbbbbbbc" atd.

  • (n, m)- označuje, že znak (nebo část vzoru, pokud je uzavřen v hranatých závorkách) se může opakovat n až mkrát. Například /ab(1,3)c/ - znamená, že řádek začíná znakem a, pak jsou zde 1 až 3 znaky b, následované znakem c. Tito. mohou to být následující řetězce: "abc", "abbc", "abbc".

  • - takový vzor je srovnatelný s jakýmkoliv jedním znakem, který patří do množiny definované v závorkách. Sada je určena výčtem nebo určením rozsahu. Vzor // může být například shodný s následujícími řetězci: "a", "b", "c".

  • [^] - takový vzor je srovnatelný s jakýmkoliv jednotlivým znakem, který nepatří do množiny definované v závorkách. Vzor /[^abc]/ může například odpovídat řetězcům: "f", "x", "Z", ale nemůže odpovídat řetězcům: "a", "b", "c".

  • ^ - označuje, že znaky jsou srovnatelné se začátkem řádku. Vzor /^abc/ může například odpovídat řetězcům: "abcd", "abcfh", ale nemůže odpovídat řetězcům: "dabc", "cbabc" atd.

  • $ - označuje, že znaky odpovídají konci řádku. Vzor /abc$/ může například odpovídat řetězcům: "dabc", "fhabc", ale nemůže odpovídat řetězcům: "abcd", "abccb" atd.

  • | - označuje několik alternativních vzorů. Například vzor /ab|c/ bude odpovídat následujícím řetězcům: "ab" a "c".

  • \ - slouží k úniku speciálních znaků, tzn. zpětné lomítko před znakem znamená, že by měl být interpretován jako speciální. Například:
    • \d- odpovídá libovolnému číslu od 0 do 9.

    • \D- vše se shoduje kromě čísla.

    • \s- odpovídá prostoru.

    • \S- odpovídá všemu kromě mezery.

    • \w- odpovídá písmenu, číslu nebo podtržítku.

    • \W- odpovídá všemu kromě písmene, číslice nebo podtržítka.


  • Například vzor /x\d\d/ bude odpovídat řetězcům: "x01", "x25" atd., ale nebude odpovídat řetězcům: "A15", "x0A"...

    Zpětné lomítko se také používá k vytvoření speciálního znakového doslovu. Pokud například potřebujeme najít řetězec "a*b", pak uvedeme následující vzor /a\*b/.

Pomocí výše uvedených literálů a metaznaků můžete vytvořit jakékoli vzory, které se vám líbí (předpokládejte regulární výrazy). Podívejme se například, co jsme napsali pro šablonu e-mailu v našem příkladu:

Var adr_pattern=/+@+\.(2,5)/i;

Zadali jsme tedy, že e-mailová adresa obsahuje číslice, písmena a podtržítka 1 nebo vícekrát, za nimi následuje znak @, pak čísla, písmena a podtržítka znovu 1krát nebo vícekrát a poté tečka následovaná písmeny 2 až 5krát. Zhruba takto vypadají e-mailové adresy.

Nyní, když víte, co jsme přesně specifikovali v ukázce, můžete zkontrolovat fungování příkladu:




Horní