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â¦)