Dejme tomu, že máme řetězec, např. +7(903)-123-45-67, a chceme v něm najít všechna čísla. Na rozdíl od předchozích příkladů nás však nezajímají jednotlivé číslice, ale celá čísla: 7, 903, 123, 45, 67.
Číslo je posloupnost 1 nebo více číslic \d. Abychom specifikovali, kolik jich potřebujeme, můžeme uvést kvantifikátor.
Kvantita {n}
Nejjednodušší kvantifikátor je číslo ve složených závorkách: {n}.
Kvantifikátor se přidává ke znaku (nebo ke znakové třídě, množině [...] atd.) a specifikuje, kolik jich potřebujeme.
Má několik pokročilejších forem, podívejme se na příklady:
- Přesný počet:
{5} -
\d{5}znamená přesně 5 číslic, totéž jako\d\d\d\d\d.Následující příklad najde 5-ciferné číslo:
alert( "Je mi 12345 let".match(/\d{5}/) ); // "12345"Abychom vyloučili delší čísla, můžeme přidat
\b:\b\d{5}\b. - Rozsah:
{3,5}, shoda 3-5krát -
Abychom našli čísla o délce 3 až 5 číslic, můžeme uvést do složených závorek hraniční hodnoty:
\d{3,5}alert( "Není mi 12, ale 1234 let".match(/\d{3,5}/) ); // "1234"Horní hranici můžeme vynechat.
Regulární výraz
\d{3,}pak hledá posloupnosti číslic o délce3a více:alert( "Není mi 12, ale 345678 let".match(/\d{3,}/) ); // "345678"
Vraťme se k řetězci +7(903)-123-45-67.
Číslo je posloupnost jedné nebo více číslic za sebou. Regulární výraz tedy bude \d{1,}:
let řetězec = "+7(903)-123-45-67";
let čísla = řetězec.match(/\d{1,}/g);
alert(čísla); // 7,903,123,45,67
Zkratky
Pro nejpoužívanější kvantifikátory existují zkratky:
+-
Znamená „jeden nebo více“, totéž jako
{1,}.Například
\d+hledá čísla:let řetězec = "+7(903)-123-45-67"; alert( řetězec.match(/\d+/g) ); // 7,903,123,45,67 ?-
Znamená „žádný nebo jeden“, totéž jako
{0,1}. Jinými slovy, učiní symbol nepovinným.Například vzor
ou?rhledáo, po němž následuje žádné nebo jednoua pakr.colou?rtedy najde jakcolor, takcolour:let řetězec = "Mám psát color nebo colour?"; alert( řetězec.match(/colou?r/g) ); // color, colour *-
Znamená „žádný nebo více“, totéž jako
{0,}. Znak se tedy může opakovat libovolněkrát nebo chybět.Například
\d0*hledá číslici následovanou libovolným počtem nul (může jich být mnoho a nemusí být žádná):alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1Porovnejte si to s
+(jeden nebo více):alert( "100 10 1".match(/\d0+/g) ); // 100, 10 // 1 se neshoduje, neboť 0+ vyžaduje aspoň jednu nulu
Další příklady
Kvantifikátory se používají velmi často a slouží jako hlavní „stavební blok“ složitých regulárních výrazů. Podívejme se tedy na další příklady.
RV pro desetinná čísla (číslo s pohyblivou řádovou tečkou): \d+\.\d+
V akci:
alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345
RV pro „otevírací HTML značku bez atributů“, například <span> nebo <p>.
-
Nejjednodušší:
/<[a-z]+>/ialert( "<body> ... </body>".match(/<[a-z]+>/gi) ); // <body>Regulární výraz hledá znak
'<', po němž následuje jedno nebo více písmen latinské abecedy a pak'>'. -
Vylepšený:
/<[a-z][a-z0-9]*>/iPodle standardu může název HTML značky obsahovat číslici na kterékoli pozici kromě první, např.
<h1>.alert( "<h1>Ahoj!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>
RV pro „otevírací nebo uzavírací HTML značku bez atributů“: /<\/?[a-z][a-z0-9]*>/i
Na začátek vzoru jsme přidali nepovinné lomítko /?. Museli jsme před ním uvést únikové zpětné lomítko, jinak by je JavaScript považoval za konec vzoru.
alert( "<h1>Ahoj!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
Na těchto příkladech vidíme jedno společné pravidlo: čím je regulární výraz přesnější, tím je delší a složitější.
Například pro HTML značky jsme mohli použít jednodušší RV: <\w+>. Protože však HTML klade na název značky přísnější omezení, je výraz <[a-z][a-z0-9]*> spolehlivější.
Můžeme použít <\w+>, nebo potřebujeme <[a-z][a-z0-9]*>?
Ve skutečném životě jsou přijatelné obě varianty. Záleží na tom, jak tolerantní můžeme být k nálezům „navíc“ a nakolik je obtížné je z výsledku odstranit jinými způsoby.
Komentáře
<code>, pro několik řádků je obalte značkou<pre>, pro více než 10 řádků vložte odkaz na pískoviště (plnkr, jsbin, codepen…)