Rýchla referencia syntaxe regulárnych výrazov

Tento kontrolný zoznam zhrňuje najčastejšie používané a ťažko zapamätateľné časti engine-u regulárnych výrazov dostupného vo väčšine častí calibre.

Triedy znakov

Triedy znakov sú užitočné na stručné vyjadrenie rôznych skupín znakov.

Príklady:

Reprezentácia

Trieda

[a-z]

Malé písmená. Nezahŕňa znaky s diakritikou a ligatúry

[a-z0-9]

Malé písmená od a do z alebo čísla od 0 do 9

[A-Za-z-]

Veľké alebo malé písmená, alebo pomlčka. Ak chcete pomlčku zahrnúť do triedy, musíte ju umiestniť na začiatok alebo na koniec, aby sa nezamieňala so spojovníkom, ktorý určuje rozsah znakov

[^0-9]

Akýkoľvek znak okrem číslice. Znak ^ umiestnený na začiatku triedy vylučuje znaky triedy (doplnená trieda)

[[a-z]--[aeiouy]]

Malé spoluhlásky. Trieda môže byť vložená do triedy. Znaky -- vylučujú to, čo po nich nasleduje

[\w--[\d_]]

Všetky písmená (vrátane cudzích znakov s diakritikou). Skrátené triedy možno použiť vnútri triedy

Príklad:

<[^<>]+> to select an HTML tag

Skrátené triedy znakov

Reprezentácia

Trieda

\d

Číslica (rovnaké ako [0-9])

\D

Akýkoľvek nečíselný znak (rovnaké ako [^0-9])

\w

Alfanumerický znak ([a-zA-Z0-9]) vrátane znakov s diakritikou a ligatúr

\W

Akýkoľvek „neznakový“ znak

\s

Medzera, pevná medzera, tabulátor, návrat vozíka

\S

Akýkoľvek „nebiely“ znak

.

Akýkoľvek znak okrem zalomenia riadku. Ak chcete zahrnúť aj znak zalomenia riadku, použite zaškrtávacie políčko „dot all“ alebo modifikátor regulárneho výrazu (?s).

Kvantifikátory

Kvantifikátor

Počet výskytov výrazu predchádzajúceho kvantifikátoru

?

0 alebo 1 výskyt výrazu. Rovnaké ako {0,1}

+

1 alebo viac výskytov výrazu. Rovnaké ako {1,}

*

0, 1 alebo viac výskytov výrazu. Rovnaké ako {0,}

{n}

Presne n výskytov výrazu

{min,max}

Počet výskytov medzi minimálnou a maximálnou hodnotou vrátane

{min,}

Počet výskytov medzi minimálnou hodnotou vrátane a nekonečnom

{,max}

Počet výskytov medzi 0 a maximálnou hodnotou vrátane

Nenásytnosť

V predvolenom nastavení je engine regulárnych výrazov pri kvantifikátoroch nenásytný: rozširuje výber čo najviac. To spočiatku často prekvapí. Znak ? za kvantifikátorom ho robí lenivým. Vyhnite sa dvom v jednom výraze, výsledok môže byť nepredvídateľný.

Dávajte pozor na vnorené kvantifikátory, napríklad vzor (a*)*, pretože exponenciálne zvyšujú čas spracovania.

Alternácia

Znak | v regulárnom výraze je logické OR. Znamená, že sa môže zhodovať buď predchádzajúci, alebo nasledujúci výraz.

Vylúčenie

Metóda 1

pattern_to_exclude(*SKIP)(*FAIL)|pattern_to_select

Príklad:

"Blabla"(*SKIP)(*FAIL)|Blabla

vyberie Blabla v reťazcoch Blabla alebo „Blabla or Blabla“, ale nie v „Blabla“.

Metóda 2

pattern_to_exclude\K|(pattern_to_select)

"Blabla"\K|(Blabla)

vyberie Blabla v reťazcoch Blabla alebo „Blabla or Blabla“, ale nie v „Blabla“.

Kotvy

Kotva je spôsob, ako sa zhodovať s logickým miestom v reťazci namiesto znaku. Najužitočnejšie kotvy na spracovanie textu sú:

\b

Označuje hranicu slova, t. j. prechod z medzery na znak, ktorý nie je medzera. Napríklad \bsurd môžete použiť na zhodu s the surd, ale nie s absurd.

^

Zodpovedá začiatku riadka (v režime viacerých riadkov, čo je predvolené)

$

Zodpovedá koncu riadka (v režime viacerých riadkov, čo je predvolené)

\K

Obnoví počiatočnú pozíciu výberu na jeho pozíciu vo vzore. Niektoré engine-y regulárnych výrazov (ale nie calibre) nepovoľujú lookbehind s premenlivou dĺžkou, najmä s kvantifikátormi. Ak môžete \K použiť s týmito engine-mi, umožní vám to tiež zbaviť sa tohto obmedzenia napísaním ekvivalentu pozitívneho lookbehind-u s premenlivou dĺžkou.

Skupiny

(expression)

Zachytávajúca skupina, ktorá ukladá výber a môže sa neskôr vyvolať vo vzoroch hľadania alebo nahrádzania pomocou \n, kde n je poradové číslo zachytávajúcej skupiny (začína sa na 1 v poradí čítania)

(?:expression)

Skupina, ktorá nezachytáva výber

(?>expression)

Atomická skupina: Len čo je výraz splnený, engine regulárnych výrazov postúpi ďalej, a ak zvyšok vzoru zlyhá, nevráti sa späť, aby vyskúšal iné kombinácie s výrazom. Atomické skupiny nezachytávajú.

(?|expression)

Skupina s resetom vetvy: vetvy alternácií zahrnuté vo výraze zdieľajú rovnaké čísla skupín

(?<name>expression)

Skupina s názvom „name“. Výber možno neskôr vyvolať vo vzore hľadania pomocou (?P=name) a v nahrádzaní pomocou \g<name>. Dve rôzne skupiny môžu použiť rovnaký názov.

Lookaround-y

Lookaround

Význam

?=

Pozitívny lookahead (umiestňuje sa za výber)

?!

Negatívny lookahead (umiestňuje sa za výber)

?<=

Pozitívny lookbehind (umiestňuje sa pred výber)

?<!

Negatívny lookbehind (umiestňuje sa pred výber)

Lookahead-y a lookbehind-y nespotrebúvajú znaky, majú nulovú dĺžku a nezachytávajú. Sú to atomické skupiny: len čo je tvrdenie splnené, engine regulárnych výrazov postúpi ďalej, a ak zvyšok vzoru zlyhá, nevráti sa späť do lookaround-u, aby vyskúšal iné kombinácie.

Pri hľadaní viacerých zhôd v reťazci môže lookbehind na počiatočnej pozícii každého pokusu o zhodu preskúmať znaky pred aktuálnou pozíciou. Preto by v reťazci 123 mal vzor (?<=\d)\d (číslica predchádzaná číslicou) teoreticky vybrať 2 a 3. Na druhej strane \d\K\d môže vybrať iba 2, pretože počiatočná pozícia po prvom výbere je bezprostredne pred 3 a na druhú zhodu nie je dostatok číslic. Podobne \d(\d) zachytáva iba 2. V praxi engine-u regulárnych výrazov calibre sa pozitívny lookbehind správa rovnako a vyberie iba 2, na rozdiel od teórie.

Skupiny možno umiestniť do lookaround-ov, ale zachytávanie je zriedka užitočné. Ak je však užitočné, bude potrebné byť veľmi opatrný pri použití kvantifikátora v lookbehind-e: nenásytnosť spojená s absenciou backtracking-u môže priniesť prekvapivé zachytenie. Z tohto dôvodu použite radšej \K než pozitívny lookbehind, ak máte kvantifikátor (alebo horšie, niekoľko) v zachytávajúcej skupine pozitívneho lookbehind-u.

Príklad negatívneho lookahead-u:

(?![^<>{}]*[>}])

Umiestnený na konci vzoru zabraňuje výberu vnútri značky alebo štýlu vloženého v súbore.

Kedykoľvek je to možné, je vždy lepšie lookaround-y „zakotviť“, aby sa znížil počet krokov potrebných na dosiahnutie výsledku.

Rekurzia

Reprezentácia

Význam

(?R)

Rekurzia celého vzoru

(?1)

Rekurzia jediného vzoru očíslovanej zachytávajúcej skupiny, tu skupiny 1

Rekurzia je volanie seba samého. To je užitočné pre vyvážené dopyty, ako sú reťazce v úvodzovkách, ktoré môžu obsahovať vložené reťazce v úvodzovkách. Ak teda počas spracovania reťazca medzi dvojitými úvodzovkami narazíme na začiatok nového reťazca medzi dvojitými úvodzovkami, vieme, čo robiť, a zavoláme seba samého. Potom máme vzor ako:

start-pattern(?>atomic sub-pattern|(?R))*end-pattern

Ak chcete vybrať reťazec medzi dvojitými úvodzovkami bez zastavenia na vloženom reťazci:

“((?>[^“”]+|(?R))*[^“”]+)”

Túto šablónu možno použiť aj na úpravu párov značiek, ktoré môžu byť vložené, ako napríklad značky <div>.

Špeciálne znaky

Reprezentácia

Znak

\t

tabulácia

\n

zalomenie riadku

\x20

(lomiteľná) medzera

\xa0

pevná medzera

Meta-znaky

Meta-znaky sú tie, ktoré majú pre engine regulárnych výrazov špeciálny význam. Z nich dvanásť musí mať pred sebou znak escape, spätné lomítko (\), aby stratili svoj špeciálny význam a stali sa opäť bežnými znakmi:

^ . [ ] $ ( ) * + ? | \

Sedem ďalších meta-znakov nemusí mať pred sebou spätné lomítko (ale môže bez akéhokoľvek iného dôsledku):

{ } ! < > = :

Špeciálne znaky strácajú svoj status, ak sa používajú vnútri triedy (medzi hranatými zátvorkami []). Zatváracia zátvorka a pomlčka majú v triede špeciálny status. Mimo triedy je pomlčka jednoduchý literál, zatváracia zátvorka zostáva meta-znakom.

Lomítko (/) a znak čísla (alebo znak hash) (#) nie sú meta-znaky, nemusia byť escapované.

V niektorých nástrojoch, ako je regex101.com s engine-om Pythonu, majú dvojité úvodzovky špeciálny status oddeľovača a musia byť escapované alebo je potrebné zmeniť možnosti. V editore calibre to tak nie je.

Režimy

(?s)

Spôsobí, že bodka (.) bude zodpovedať aj znakom zalomenia riadku

(?m)

Spôsobí, že kotvy ^ a $ budú zodpovedať začiatku a koncu riadkov namiesto začiatku a konca celého reťazca.