Alternace je termín v regulárním výrazu, který je ve skutečnosti jednoduchým „NEBO“.
V regulárním výrazu je označen znakem svislé čáry |
.
Potřebujeme například najít programovací jazyky:HTML, PHP, Java nebo JavaScript.
Odpovídající regulární výraz:html|php|java(script)?
.
Příklad použití:
let regexp = /html|php|css|java(script)?/gi;
let str = "First HTML appeared, then CSS, then JavaScript";
alert( str.match(regexp) ); // 'HTML', 'CSS', 'JavaScript'
Podobnou věc jsme již viděli – hranaté závorky. Umožňují výběr mezi více znaky, například gr[ae]y
odpovídá gray
nebo grey
.
Hranaté závorky povolují pouze znaky nebo třídy znaků. Střídání umožňuje jakékoli výrazy. Regulární výraz A|B|C
znamená jeden z výrazů A
, B
nebo C
.
Například:
gr(a|e)y
znamená přesně to samé jakogr[ae]y
.gra|ey
znamenágra
neboey
.
Chcete-li použít střídání na vybranou část vzoru, můžeme ji uzavřít do závorek:
I love HTML|CSS
odpovídáI love HTML
neboCSS
.I love (HTML|CSS)
odpovídáI love HTML
neboI love CSS
.
Příklad:regulární výraz pro čas
V předchozích článcích byl úkol vytvořit regulární výraz pro vyhledávání času ve tvaru hh:mm
, například 12:00
. Ale jednoduchý \d\d:\d\d
je příliš vágní. Přijímá 25:99
jako čas (protože vzoru odpovídá 99 minut, ale tento čas je neplatný).
Jak můžeme vytvořit lepší vzor?
Můžeme použít opatrnější párování. Nejprve hodiny:
- Pokud je první číslice
0
nebo1
, pak další číslice může být jakákoli:[01]\d
. - Jinak, pokud je první číslice
2
, pak další musí být[0-3]
. - (žádná jiná první číslice není povolena)
Obě varianty můžeme zapsat do regulárního výrazu pomocí alternace:[01]\d|2[0-3]
.
Dále musí být minuty od 00
na 59
. V jazyce regulárních výrazů, který lze zapsat jako [0-5]\d
:první číslice 0-5
a poté libovolnou číslici.
Pokud slepíme hodiny a minuty dohromady, dostaneme vzor:[01]\d|2[0-3]:[0-5]\d
.
Už jsme skoro hotovi, ale je tu problém. Alternativa |
nyní je mezi [01]\d
a 2[0-3]:[0-5]\d
.
To znamená:minuty se přidávají k druhé variantě alternace, zde je jasný obrázek:
[01]\d | 2[0-3]:[0-5]\d
Tento vzor hledá [01]\d
nebo 2[0-3]:[0-5]\d
.
Ale to je špatně, alternace by měla být použita pouze v části „hodiny“ regulárního výrazu, aby bylo možné [01]\d
NEBO 2[0-3]
. Opravme to uzavřením „hodin“ do závorek:([01]\d|2[0-3]):[0-5]\d
.
Konečné řešení:
let regexp = /([01]\d|2[0-3]):[0-5]\d/g;
alert("00:00 10:10 23:59 25:99 1:2".match(regexp)); // 00:00,10:10,23:59