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 |
|
Malé písmená. Nezahŕňa znaky s diakritikou a ligatúry |
|
Malé písmená od a do z alebo čísla od 0 do 9 |
|
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 |
|
Akýkoľvek znak okrem číslice. Znak ^ umiestnený na začiatku triedy vylučuje znaky triedy (doplnená trieda) |
|
Malé spoluhlásky. Trieda môže byť vložená do triedy. Znaky |
|
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 |
|
Číslica (rovnaké ako |
|
Akýkoľvek nečíselný znak (rovnaké ako |
|
Alfanumerický znak ( |
|
Akýkoľvek „neznakový“ znak |
|
Medzera, pevná medzera, tabulátor, návrat vozíka |
|
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 |
Kvantifikátory¶
Kvantifikátor |
Počet výskytov výrazu predchádzajúceho kvantifikátoru |
|
0 alebo 1 výskyt výrazu. Rovnaké ako |
|
1 alebo viac výskytov výrazu. Rovnaké ako |
|
0, 1 alebo viac výskytov výrazu. Rovnaké ako |
|
Presne n výskytov výrazu |
|
Počet výskytov medzi minimálnou a maximálnou hodnotou vrátane |
|
Počet výskytov medzi minimálnou hodnotou vrátane a nekonečnom |
|
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ú:
\bOznačuje hranicu slova, t. j. prechod z medzery na znak, ktorý nie je medzera. Napríklad
\bsurdmôžete použiť na zhodu sthe surd, ale nie sabsurd.^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é)
\KObnoví 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
\Kpouž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, kdenje 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 |
|
Rekurzia celého vzoru |
|
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 |
|
tabulácia |
|
zalomenie riadku |
|
(lomiteľná) medzera |
|
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.
