20. září 2026

Kvantifikátory +, *, ? a {n}

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élce 3 a 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?r hledá o, po němž následuje žádné nebo jedno u a pak r.

colou?r tedy najde jak color, tak colour:

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, 1

Porovnejte 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>.

  1. Nejjednodušší: /<[a-z]+>/i

    alert( "<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 '>'.

  2. Vylepšený: /<[a-z][a-z0-9]*>/i

    Podle 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>
Abychom učinili regulární výraz přesnějším, musíme jej často učinit složitějším

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.

Úlohy

důležitost: 5

Vytvořte regulární výraz, který najde výpustku: 3 (nebo více?) teček za sebou.

Otestujte si ho:

let rv = /váš RV/g;
alert( "Ahoj!... Jak se máš?.....".match(rv) ); // ..., .....

Řešení:

let rv = /\.{3,}/g;
alert( "Ahoj!... Jak se máš?.....".match(rv) ); // ..., .....

Prosíme všimněte si, že tečka je speciální znak, takže před ni musíme vložit únikový znak: \..

Vytvořte regulární výraz, který najde HTML barvy zapsané ve tvaru #ABCDEF: nejprve # a pak 6 hexadecimálních znaků.

Příklad použití:

let rv = /...váš RV.../

let řetězec = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2 #12345678";

alert( řetězec.match(rv) )  // #121212,#AA00ef

P.S. V této úloze se nemusíte zabývat jinými formáty barev, např. #123 nebo rgb(1,2,3) atd.

Potřebujeme najít # následované 6 hexadecimálními znaky.

Hexadecimální znak můžeme popsat jako [0-9a-fA-F]. Nebo když použijeme příznak i, stačí nám [0-9a-f].

Pak jich můžeme najít 6 pomocí kvantifikátoru {6}.

Výsledkem bude regulární výraz /#[a-f0-9]{6}/gi.

let rv = /#[a-f0-9]{6}/gi;

let řetězec = "color:#121212; background-color:#AA00ef bad-colors:f#fddee #fd2"

alert( řetězec.match(rv) );  // #121212,#AA00ef

Problém je, že nalezne barvu i v delších posloupnostech:

alert( "#12345678".match( /#[a-f0-9]{6}/gi ) ) // #123456

Abychom to opravili, můžeme na konec přidat \b:

// barva
alert( "#123456".match( /#[a-f0-9]{6}\b/gi ) ); // #123456

// toto není barva
alert( "#12345678".match( /#[a-f0-9]{6}\b/gi ) ); // null
Mapa tutoriálu

Komentáře

přečtěte si před komentováním…
  • Máte-li návrhy na zlepšení, vytvořte prosím issue na GitHubu nebo pull request místo komentáře.
  • Pokud v článku něčemu nerozumíte, napište prosím, čemu přesně a na kterém místě.
  • Pro vložení několika slov kódu použijte značku <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…)