Stáhnout PDF
Regulární výraz je skupina znaků nebo symbolů, která se používá k nalezení určitého vzoru z nějakého textu; můžete je nazvat zástupnými znaky na steroidech, chcete-li. Jako vývojáři může být zvládnutí regulárních výrazů mocným nástrojem ve vašem opasku s nástroji; určitě je někdy budete muset použít ve svých programech, vyhledávání a nahrazování pomocí regulárních výrazů v IDE se někdy opravdu hodí a sám se přistihnu, že je používám v příkazovém řádku každý den.
Různé aplikace a programovací jazyky mohou mít různé implementace regulárních výrazů, ale základní koncepty jsou většinou stejné. V tomto příspěvku vám vysvětlím vše, co potřebujete vědět o regulárních výrazech.
Regulární výraz je vzor, který se porovnává s předmětným řetězcem zleva doprava. Slovo „regulární výraz“ je příliš frekventované, obvykle se setkáte s jeho zkratkou „regex“ nebo „regexp“. Regulární výraz se používá pro nahrazování textu v řetězci, ověřování formuláře, extrakci podřetězce z řetězce na základě shody se vzorem a mnoho dalšího.
Představte si, že píšete aplikaci a chcete nastavit pravidla pro to, kdy si uživatel zvolí své uživatelské jméno. Chceme povolit, aby uživatelské jméno obsahovalo písmena, číslice, podtržítka a pomlčky. Chceme také omezit počet znaků v uživatelském jménu, aby nevypadalo ošklivě. Pro ověření uživatelského jména použijeme následující regulární výraz:
Výše uvedený regulární výraz může akceptovat řetězce john_doe
, jo-hn_doe
a john12_as
. Neshoduje se s Jo
, protože tento řetězec obsahuje velká písmena a navíc je příliš krátký.
- Tabulka obsahu
- Základní matchery
- Metaznaky
- 2.1 Tečka
- 2.2 Sada znaků
- 2.2.1 Negace množiny znaků
- 2.3 Opakování
- 2.3.1 Hvězda
- 2.3.2 Plus
- 2.3.3 Otazník
- 2.4 Závorky
- 2.5 Skupina znaků
- 2.6 Střídání
- 2.7 Únik speciálního znaku
- 2.8 Kotvy
- 2.8.1 Caret
- 2.8.2 Dolar
- Zkrácené znakové sady
- Lookaround
- 4.1 Pozitivní lookahead
- 4.2 Záporný lookahead
- 4.3 Pozitivní lookbehind
- 4.4 Negativní lookbehind
- Příznaky
- 5.1 Nerozlišování velkých a malých písmen
- 5.2 Globální hledání
- 5.3 Víceřádková
- Chamtivé vs. líné porovnávání
Tabulka obsahu
- Základní shodné znaky
- Meta znak
- Plná tečka
- Sada znaků
- Negativní sada znaků
- Repetitions
- Př. Hvězdička
- Plus
- Otázník
- Závorky
- Skupina znaků
- Alternace
- Speciální znak pro únik
- Otázník
- Závorka
- Závorka
- Dolar
- Krátké znakové sady
- Pohled kolem dokola
- Pozitivní pohled kolem dokola
- Negativní pohled kolem dokola
- Pozitivní pohled dozadu
- Vlajky
- Nezávislost na velikosti písmen
- Globální hledání
- Víceřádkové hledání
- Lehké vs. líné hledání
.
Základní matchery
Regulární výraz je pouze vzor znaků, který používáme k
vyhledávání v textu. Například regulární výraz the
znamená: písmenot
, za ním písmeno h
, za ním písmeno e
.
the => The fat cat sat on the mat.
Test regulárního výrazu
Regulární výraz 123
odpovídá řetězci 123
. Regulární výraz se porovnává se vstupním řetězcem tak, že se postupně porovnávají jednotlivé znaky regulárního výrazu
s jednotlivými znaky vstupního řetězce. Regulární
výrazy obvykle rozlišují malá a velká písmena, takže regulární výraz The
by
neodpovídal řetězci the
.
The => The fat cat sat on the mat.
Test regulárního výrazu
Metaznaky
Metaznaky jsou stavebními kameny regulárních výrazů. Meta
znaky nestojí samy za sebe, ale jsou interpretovány určitým
zvláštním způsobem. Některé meta znaky mají zvláštní význam a zapisují se do hranatých závorek. Meta znaky jsou následující:
2.1 Tečka
Tečka . je nejjednodušším příkladem meta znaku. Metaznak .
odpovídá jakémukoli jednotlivému znaku. Neodpovídá znakům return ani znakům nového řádku.
Příklad regulární výraz .ar
znamená: libovolný znak, za kterým následuje písmeno a
, za kterým následuje písmeno r
.
.ar => The car parked in the garage.
Test regulárního výrazu
2.2 Sada znaků
Sada znaků se také nazývá třída znaků. Pro
určení znakových sad se používají hranaté závorky. Pomocí pomlčky uvnitř znakové sady určíte rozsah znaků. Na pořadí rozsahu znaků uvnitř hranatých závorek
nezáleží. Například regulární výraz he
znamená: velké písmeno T
nebo malé písmeno t
, po kterém následuje písmeno h
, po kterém následuje písmeno e
.
he => The car parked in the garage.
Test regulárního výrazu
Tečka uvnitř znakové sady však znamená doslovnou tečku. Regulární výraz
ar
znamená: malý znak a
následovaný písmenem r
,
za kterým následuje znak tečka .
.
ar => A garage is a good place to park a car.
Test regulárního výrazu
2.2.1 Negace množiny znaků
Obvykle symbol caret představuje začátek řetězce, ale pokud je
uveden za úvodní hranatou závorkou, neguje množinu znaků. Například
regulární výraz ar
znamená: libovolný znak kromě c
,
za kterým následuje znak a
, za kterým následuje písmeno r
.
ar => The car parked in the garage.
Test regulárního výrazu
2.3 Opakování
Následující metaznaky +
, *
nebo ?
slouží k určení, kolikrát se může dílčí vzor vyskytnout. Tyto metaznaky se v různých
situacích chovají různě.
2.3.1 Hvězda
Symbol *
odpovídá nule nebo více opakováním předchozího maticového znaku. Regulární výraz a*
znamená: nula nebo více opakování předchozího malého znaku a
. Pokud se však objeví za znakovou sadou nebo třídou, pak najde opakování celé znakové sady. Například regulární výraz *
znamená: libovolný počet malých písmen v řadě.
* => The car parked in the garage #21.
Test regulárního výrazu
Symbol *
lze použít s metaznakem . pro shodu s libovolným řetězcem
znaků .*
. Symbol *
lze použít s bílým znakem \s
pro shodu s řetězcem bílých znaků. Například výraz\s*cat\s*
znamená: nula nebo více mezer, za nimiž následuje malý znak c
,
za nimiž následuje malý znak a
, za nimiž následuje malý znak t
, za nimiž následuje nula nebo více mezer.
\s*cat\s* => The fat cat sat on the concatenation.
Test regulárního výrazu
2.3.2 Plus
Symbol +
odpovídá jednomu nebo více opakováním předchozího znaku. Například regulární výraz c.+t
znamená: malé písmeno c
, po kterém následuje alespoň jeden znak, po kterém následuje malý znak t
. Je třeba upřesnit, že t
je poslední t
ve větě.
c.+t => The fat cat sat on the mat.
Test regulárního výrazu
2.3.3 Otazník
V regulárním výrazu metaznak ?
činí předchozí znak
nepovinným. Tento symbol odpovídá nule nebo jednomu výskytu předchozího znaku. Například regulární výraz ?he
znamená:
he => The car is parked in the garage.
Test regulárního výrazu
?he => The car is parked in the garage.
Test regulárního výrazu
2.4 Závorky
V regulárních výrazech se závorky, které se také nazývají kvantifikátory, používají k
určení počtu opakování znaku nebo skupiny znaků
. Například regulární výraz {2,3}
znamená: Shodují se alespoň 2 číslice, ale ne více než 3 ( znaky v rozsahu 0 až 9).
{2,3} => The number was 9.9997 but we rounded it off to 10.0.
Test regulárního výrazu
Druhou číslici můžeme vynechat. Například regulární výraz{2,}
znamená: Shodují se 2 nebo více číslic. Pokud odstraníme i čárku, znamená regulární výraz
{3}
:
{2,} => The number was 9.9997 but we rounded it off to 10.0.
Test regulárního výrazu
{3} => The number was 9.9997 but we rounded it off to 10.0.
Test regulárního výrazu
2.5 Skupina znaků
Skupina znaků je skupina dílčích vzorů, která se zapisuje do závorek (…)
. Jak jsme si již řekli dříve, pokud v regulárním výrazu vložíme za znak kvantifikátor, pak se bude opakovat předchozí znak. Pokud však kvantifikátor vložíme za skupinu znaků, pak se opakuje celá skupina znaků. Například regulární výraz (ab)*
odpovídá nule nebo více opakováním znaku ab
. Můžeme také použít alternaci |
metaznak uvnitř skupiny znaků. Například regulární výraz (c|g|p)ar
znamená: malý znak c
, g
nebo p
, po kterém následuje znak a
, po kterém následuje znak r
.
(c|g|p)ar => The car is parked in the garage.
Test regulárního výrazu
2.6 Střídání
V regulárních výrazech se k definování střídání používá svislá lišta |
. Střídání je jako podmínka mezi více výrazy. Možná si teď myslíte, že znaková sada a alternace fungují stejně. Ale velký rozdíl mezi znakovou sadou a alternací je v tom, že znaková sada pracuje na úrovni znaků, ale alternace pracuje na úrovni výrazů. Například regulární výraz (T|t)he|car
znamená: velký znak T
nebo malý znak t
, následuje malý znak h
, následuje malý znak e
nebo malý znak c
, následuje malý znak a
, následuje malý znak r
.
(T|t)he|car => The car is parked in the garage.
Test regulárního výrazu
2.7 Únik speciálního znaku
Zpětné lomítko \
se v regulárním výrazu používá k úniku dalšího znaku. To
umožňuje zadat symbol jako odpovídající znak včetně rezervovaných
znaků { } / \ + * . $ ^ | ?
. Chcete-li použít speciální znak jako odpovídající znak, předepište před něj \.
Například regulární výraz . slouží k přiřazení jakéhokoli znaku kromě
nového řádku. Nyní pro shodu . ve vstupním řetězci regulární výraz (f|c|m)at\.?
znamená: malé písmeno f
, c
nebo m
následované malým
znakem a
, následovaným malým písmenem t
, následovaným nepovinným znakem .
.
(f|c|m)at\.? => The fat cat sat on the mat.
Test regulárního výrazu
2.8 Kotvy
V regulárních výrazech používáme kotvy pro kontrolu, zda odpovídající symbol je
počáteční nebo koncový symbol vstupního řetězce. Kotvy jsou dvou typů: Prvním typem je Caret ^
, který kontroluje, zda je odpovídající znak počátečním
znakem vstupního řetězce, a druhým typem je Dollar $
, který kontroluje, zda je odpovídající
znak posledním znakem vstupního řetězce.
2.8.1 Caret
Symbol Caret ^
slouží ke kontrole, zda je odpovídající znak prvním znakem
vstupního řetězce. Pokud na vstupní řetězec abc
aplikujeme následující regulární výraz ^a
(pokud je a
počáteční symbol), odpovídá a
. Pokud však na výše uvedený vstupní řetězec aplikujeme regulární výraz ^b
, neshoduje se s ničím. Protože ve vstupním řetězci abc
b
není počáteční symbol. Podívejme se na jiný regulární výraz ^(T|t)he
, který znamená: Velký znak T
nebo malý znak t
je počátečním symbolem vstupního řetězce, následuje
malý znak h
, za ním malý znak e
.
(T|t)he => The car is parked in the garage.
Test regulárního výrazu
^(T|t)he => The car is parked in the garage.
Test regulárního výrazu
2.8.2 Dolar
Symbol dolaru $
slouží ke kontrole, zda je odpovídajícím znakem poslední znak
vstupního řetězce. Například regulární výraz (at\.)$
znamená: znak malého písmene a
, následovaný znakem malého písmene t
, následovaný znakem .
a maticí musí být konec řetězce.
(at\.) => The fat cat. sat. on the mat.
Test regulárního výrazu
(at\.)$ => The fat cat. sat. on the mat.
Test regulárního výrazu
Zkrácené znakové sady
Regulární výraz poskytuje zkratky pro běžně používané znakové sady, které nabízejí pohodlné zkratky pro běžně používané regulární výrazy. Zkrácené znakové sady jsou následující:
Lookaround
Lookbehind a lookahead (nazývané také lookaround) jsou specifické typy
neodpovídajících skupin (Slouží ke shodě se vzorem, ale nejsou zahrnuty do seznamu shod). Lookaheads se používají, pokud máme podmínku, že tomuto vzoru předchází nebo za ním následuje jiný určitý vzor. Například chceme získat všechna čísla, kterým předchází znak $
, z následujícího vstupního řetězce .44 and .88
. Použijeme následující regulární výraz (?<=$)*
, což znamená: získáme všechna čísla, která obsahují znak . a kterým předchází znak $
. Následují lookaroundy, které se používají v regulárních výrazech:
4.1 Pozitivní lookahead
Pozitivní lookahead tvrdí, že za první částí výrazu musí následovat
výraz lookahead. Vrácená shoda obsahuje pouze text, kterému odpovídá první část výrazu. K definici pozitivního
lookahead se používají závorky. Uvnitř těchto závorek se používá otazník se znaménkem rovnosti takto: (?=…)
. Výraz Lookahead se zapisuje za znaménko rovnítka uvnitř závorek. Například regulární výraz(T|t)he(?=\sfat)
znamená: volitelně porovnejte malé písmeno t
nebo velké písmeno T
, za kterým následuje písmeno h
, za kterým následuje písmeno e
. V závorce definujeme kladný lookahead, který říká regulárnímu výrazu, aby porovnal The
nebo the
, za kterými následuje slovo fat
.
(T|t)he(?=\sfat) => The fat cat sat on the mat.
Test regulárního výrazu
4.2 Záporný lookahead
Záporný lookahead se používá, když potřebujeme získat všechny shody ze vstupního řetězce
, za kterými nenásleduje vzor. Negativní lookahead je definován stejně jako pozitivní lookahead, ale s tím rozdílem, že místo znaku rovnosti =
použijeme znak negace !
, tedy (?!…)
. Podívejme se na následující regulární výraz (T|t)he(?!\sfat)
, který znamená: získej ze vstupního řetězce všechna slova The
nebo the
, za kterými nenásleduje slovo fat
, jemuž předchází znak mezery.
(T|t)he(?!\sfat) => The fat cat sat on the mat.
Test regulárního výrazu
4.3 Pozitivní lookbehind
Pozitivní lookbehind se používá k získání všech shod, kterým předchází určitý vzor
. Pozitivní lookbehind je označen (?<=…)
. Například regulární výraz (?<=(T|t)he\s)(fat|mat)
znamená: získejte všechna slova fat
nebo mat
ze vstupního řetězce, která jsou za slovem The
nebo the
.
(?<=(T|t)he\s)(fat|mat) => The fat cat sat on the mat.
Test regulárního výrazu
4.4 Negativní lookbehind
Negativní lookbehind se používá k získání všech shod, kterým nepředchází specifický vzor
. Negativní lookbehind je označen (?<!…)
. Například regulární výraz (?<!(T|t)he\s)(cat)
znamená: získá ze vstupního řetězce všechna cat
slova, která nejsou za slovem The
nebo the
.
(?<!(T|t)he\s)(cat) => The cat sat on cat.
Test regulárního výrazu
Příznaky
Příznaky se také nazývají modifikátory, protože upravují výstup regulárního
výrazu. Tyto příznaky lze použít v libovolném pořadí nebo kombinaci a jsou
nedílnou součástí RegExp.
5.1 Nerozlišování velkých a malých písmen
Modifikátor i
slouží k provádění porovnávání bez rozlišení velikosti písmen. Například regulární výraz /The/gi
znamená: velké písmeno T
, následované malým písmenem h
, následované znakem e
. A na konci regulárního výrazu příznak i
říká regulárnímu výrazu, aby ignoroval velikost písmen. Jak vidíte, uvedli jsme také příznak g
, protože chceme hledat vzor v celém vstupním řetězci.
The => The fat cat sat on the mat.
Test regulárního výrazu
/The/gi => The fat cat sat on the mat.
Test regulárního výrazu
5.2 Globální hledání
Modifikátor g
slouží k provedení globální shody (nalezení všech shod, nikoli zastavení po první shodě). Například regulární výraz /.(at)/g
znamená: libovolný znak kromě nového řádku, za kterým následuje malý znak a
, za kterým následuje malý znak t
. Protože jsme na konci regulárního výrazu uvedli příznak g
, najde nyní všechny shody ve vstupním řetězci, nejen první (což je výchozí chování).
/.(at)/ => The fat cat sat on the mat.
Test regulárního výrazu
/.(at)/g => The fat cat sat on the mat.
Test regulárního výrazu
5.3 Víceřádková
Modifikátor m
slouží k provedení víceřádkové shody. Jak jsme si již řekli dříve
, kotvy (^, $)
slouží ke kontrole, zda je vzor na začátku vstupního řetězce nebo na jeho konci. Pokud však chceme, aby kotvy fungovaly na každém řádku, použijeme příznakm
. Například regulární výraz /at(.)?$/gm
znamená: malý
znak a
, následuje malý znak t, volitelně cokoli kromě
nového řádku. A díky příznaku m
nyní stroj regulárních výrazů porovnává vzor na konci každého řádku v řetězci.
/.at(.)?$/ => The fat
cat sat
on the mat.
Test regulárního výrazu
"/.at(.)?$/gm" => The fat
cat sat
on the mat.
Test regulárního výrazu
Ve výchozím nastavení bude regex provádět chamtivé porovnávání , což znamená, že bude porovnávat tak dlouho, jak
je to možné. Můžeme použít ?
pro líné párování, to znamená co nejkratší
/(.*at)/ => The fat cat sat on the mat.
Test regulárního výrazu
/(.*?at)/ => The fat cat sat on the mat.
Test regulárního výrazu
A tím tento příspěvek končí. Doufám, že tento příspěvek byl užitečný. Nezapomeňte si procvičit, co jste se naučili, pomocí služeb jako regexr.com nebo regex101.com.
.