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

Řekněme, že máme řetězec jako +7(903)-123-45-67 a chcete v něm najít všechna čísla. Ale na rozdíl od dřívějška nás nezajímají jednotlivá čísla, ale celá čísla:7, 903, 123, 45, 67 .

Číslo je posloupnost 1 nebo více číslic \d . Abychom označili, kolik jich potřebujeme, můžeme připojit kvantifikátor .

Množství {n}

Nejjednodušší kvantifikátor je číslo ve složených závorkách:{n} .

Kvantifikátor je připojen ke znaku (nebo třídě znaků nebo [...] set atd.) a určuje, kolik jich potřebujeme.

Má několik pokročilých forem, podívejme se na příklady:

Přesný počet:{5}

\d{5} označuje přesně 5 číslic, stejně jako \d\d\d\d\d .

Níže uvedený příklad hledá 5místné číslo:

alert( "I'm 12345 years old".match(/\d{5}/) ); //  "12345"

Můžeme přidat \b pro vyloučení delších čísel:\b\d{5}\b .

Rozsah:{3,5} , zápas 3–5krát

Abychom našli čísla od 3 do 5 číslic, můžeme limity vložit do složených závorek:\d{3,5}

alert( "I'm not 12, but 1234 years old".match(/\d{3,5}/) ); // "1234"

Horní limit můžeme vynechat.

Potom regulární výraz \d{3,} hledá sekvence číslic délky 3 nebo více:

alert( "I'm not 12, but 345678 years old".match(/\d{3,}/) ); // "345678"

Vraťme se k řetězci +7(903)-123-45-67 .

Číslo je posloupnost jedné nebo více číslic v řadě. Regulární výraz je tedy \d{1,} :

let str = "+7(903)-123-45-67";

let numbers = str.match(/\d{1,}/g);

alert(numbers); // 7,903,123,45,67

Krátkopisy

Pro většinu používaných kvantifikátorů existují zkratky:

+

Znamená „jeden nebo více“, stejně jako {1,} .

Například \d+ hledá čísla:

let str = "+7(903)-123-45-67";

alert( str.match(/\d+/g) ); // 7,903,123,45,67
?

Znamená „nula nebo jedna“, stejně jako {0,1} . Jinými slovy, symbol je volitelný.

Například vzor ou?r hledá o následuje nula nebo jedna u a poté r .

Takže colou?r najde obě color a colour :

let str = "Should I write color or colour?";

alert( str.match(/colou?r/g) ); // color, colour
*

Znamená „nula nebo více“, stejně jako {0,} . To znamená, že znak se může kdykoli opakovat nebo může chybět.

Například \d0* hledá číslici následovanou libovolným počtem nul (může jich být mnoho nebo žádná):

alert( "100 10 1".match(/\d0*/g) ); // 100, 10, 1

Porovnejte to s + (jeden nebo více):

alert( "100 10 1".match(/\d0+/g) ); // 100, 10
// 1 not matched, as 0+ requires at least one zero

Další příklady

Kvantifikátory se používají velmi často. Slouží jako hlavní „stavební kámen“ složitých regulárních výrazů, takže se podívejme na další příklady.

Regexp pro desetinné zlomky (číslo s plovoucí desetinnou čárkou):\d+\.\d+

V akci:

alert( "0 1 12.345 7890".match(/\d+\.\d+/g) ); // 12.345

Regexp pro „úvodní značku HTML 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 '<' následuje jedno nebo více latinských písmen a poté '>' .

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

    Podle standardu může mít název značky HTML číslici na libovolné pozici kromě první, například <h1> .

    alert( "<h1>Hi!</h1>".match(/<[a-z][a-z0-9]*>/gi) ); // <h1>

Regexp „otevření nebo zavření značky HTML bez atributů“:/<\/?[a-z][a-z0-9]*>/i

Přidali jsme volitelné lomítko /? blízko začátku vzoru. Musel to uniknout zpětným lomítkem, jinak by si JavaScript myslel, že je to konec vzoru.

alert( "<h1>Hi!</h1>".match(/<\/?[a-z][a-z0-9]*>/gi) ); // <h1>, </h1>
Aby byl regulární výraz přesnější, často jej potřebujeme udělat složitější

V těchto příkladech můžeme vidět jedno společné pravidlo:čím přesnější je regulární výraz – tím je delší a složitější.

Například pro HTML značky bychom mohli použít jednodušší regulární výraz:<\w+> . Ale protože HTML má přísnější omezení pro název značky, <[a-z][a-z0-9]*> je spolehlivější.

Můžeme použít <\w+> nebo potřebujeme <[a-z][a-z0-9]*> ?

V reálném životě jsou přijatelné obě varianty. Záleží na tom, jak tolerantní dokážeme být k „nadbytečným“ shodám a zda je obtížné je odstranit z výsledku jinými prostředky.