Rychlý odkaz pro syntaxi regulárních výrazů

Tento kontrolní seznam shrnuje nejčastěji používané nebo těžko zapamatovatelné části modulu regulárních výrazů, které jsou k dostupné ve funkcích Calibre pro úpravy, převod a hledání a nahrazování. Pamatujte, že tento modul je výkonnější než základní modul regulárních výrazů používaný ve zbytku Calibre.

Třídy znaků

Stručně řečeno jsou třídy znaků užitečné pro zastupování různých skupin znaků.

Příklady:

Zastoupení Třída
[a-z] Malá písmena. Nezahrnuje znaky s diakritikou a ligatury
[a-z0-9] Malá písmena od a do z nebo čísla od 0 do 9
[A-Za-z-] Velká nebo malá písmena nebo pomlčka. Pro zahrnutí pomlčky do třídy ji musíte umístit na začátek nebo na konec, aby se nepletla se spojovníkem, který určuje rozsah znaků.
[^0-9] Libovolný znak kromě číslice. Stříška (^) umístěná na začátku třídy vylučuje znaky ze třídy (doplňková třída)
[[a-z]--[aeiouy]] Malá písmena souhlásek. Třída může být zahrnuta do třídy. Znaky -- vylučují to, co následuje
[\w--[\d_]] Všechna písmena (včetně cizích znaků s diakritikou). Uvnitř třídy lze použít zkrácené třídy

Příklad:

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

Zjednodušené třídy znaků

Zastoupení Třída
\d Číslo (stejné jako [0-9])
\D Libovolný nečíselný znak (stejné jako [^0-9])
\w Alfanumerický znak ([a-zA-Z0-9]) včetně znaků s diakritikou a ligatur
\W Libovolný znak, který není „slovo“
\s Mezera, pevná mezera, tabulátor, enter.
\S Libovolný znak, který není „prázdný znak“
. Jakýkoliv znak kromě nového řádku. Použijte zaškrtávací políčko „vytečkovat vše“ nebo modifikátor regulárních výrazů (?s) pro zahrnutí nového řádku.

Kvantifikátory

Kvantifikátor Počet výskytů výrazů předcházejících kvantifikátor
? 0 nebo 1 výskytů výrazu. Stejné jako {0,1}
+ 1 nebo více výskytů výrazu. Stejné jako {1,}
* 0, 1 nebo více výskytů výrazu. Stejné jako {0,}
{n} Přesně n výskytů výrazu
{min,max} Počet výskytů mezi minimální a maximální hodnotou včetně
{min,} Počet výskytů mezi minimální hodnotou včetně a nekonečnem
{,max} Počet výskytů mezi 0 a maximální hodnotou včetně

Nenasytnost

Ve výchozím nastavení je modul regulárního výrazu s kvantifikátory nenasytný: rozšiřuje výběr co nejvíce. To zpočátku často způsobuje překvapení. ? následovaný kvantifikátorem je lenost. Vyhněte se dávání dvou do stejného výrazu, výsledek může být nepředvídatelný.

Dejte si pozor na vnořené kvantifikátory, například vzor (a*)*, protože exponenciálně zvyšuje dobu zpracování.

Alternace

Znak | v regulárním výrazu je logické OR. To znamená, že se může shodovat buď předcházející nebo následující výraz.

Vyloučení

Metoda 1

vzor_k_vyloučení(*SKIP)(*FAIL)|vzor_k_vybrání

Příklad:

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

vybere Blabla v řetězcích Blabla nebo „Blabla nebo Blabla“, ale ne v „Blabla“.

Metoda 2

vzor_k_vyloučení\K|(vzor_k_vybrání)

"Blabla"\K|(Blabla)

vybere Blabla v řetězcích Blabla nebo „Blabla nebo Blabla“, ale ne v „Blabla“.

Kotvy

Kotva je způsob, jak porovnat logické umístění v řetězci, spíše než znaku. Nejužitečnější kotvy pro zpracování textu jsou:

\b
Určuje hranici slova, tj. přechod z mezery na nemezerový znak. Například můžete použít \bdar, aby odpovídal mám dar, ale ne nezdar.
^
Odpovídá začátku řádku (v režimu více řádků, což je výchozí nastavení)
$
Odpovídá konci řádku (v režimu více řádků, což je výchozí nastavení)
\K
Obnovuje výchozí pozici výběru na pozici ve vzoru. Některé moduly regulárních výrazů (ale ne Calibre) nedovolí hledat vpřed v proměnlivé délce, obzvláště s kvantifikátory. Když můžete s těmito moduly použít \K, také vám to umožní zbavit se tohoto limitu napsáním ekvivalentu pozitivního hledání vpřed v proměnlivé délce.

Skupiny

(výraz)
Zachytávací skupina: Uloží výběr a může být později vyvolána ve vzorech search nebo replace pomocí \n, kde n je pořadové číslo zachytávací skupiny (počínaje od 1 v pořadí čtení)
(?:výraz)
Skupina, která nezachytí výběr
(?>výraz)
Atomická skupina: Jakmile je výraz splněn, modul regulárních výrazů ji předá. A pokud zbytek vzoru selže, nebude se snažit vyzkoušet jiné kombinace s výrazem. Atomické skupiny nezachycují.
(?|výraz)
Skupina obnovení větve: Větve alternativ zahrnutých ve výrazu sdílejí stejná čísla skupin
(?<name>výraz)
Skupina s názvem „name“: Výběr lze později vyvolat ve vzorci search pomocí výrazu (?P=name) a ve vzorci replace výrazem \g. Dvě různé skupiny mohou používat stejný název.

Prohledávání

Prohledávání Význam
?= Pozitivní hledání vpřed (bude umístěno za výběr)
?! Negativní hledání vpřed (bude umístěno za výběr)
?<= Pozitivní hledání zpět (bude umístěno před výběr)
?<! Negativní hledání zpět (bude umístěno před výběr)

Hledání vpřed a zpět nespotřebovávají znaky, jsou nulové délky a nezachycují. Jsou to atomické skupiny: jakmile je tvrzení splněno, modul regulárních výrazů ho předá, a pokud zbytek vzoru selže, nebude se vracet zpět do prohledávání, aby vyzkoušel jiné kombinace.

Při hledání více shod v řetězci, v počáteční pozici každého pokusu o shodu, může hledání zpět zkontrolovat znaky před aktuální pozicí. Proto v řetězci 123 by měl vzor (?<=\d)\d (číslice předcházející číslici) teoreticky vybrat 2 a 3. Na druhou stranu \d\K\d může vybrat pouze 2, protože počáteční pozice po prvním výběru je bezprostředně před 3 a pro druhou shodu zde není dostatek číslic. Podobně \d(\d) zachytí pouze 2. V modulu regulárních výrazů Calibre se pozitivní hledání zpět chová stejně a vybere pouze 2, na rozdíl od teorie.

Skupiny mohou být umístěny uvnitř prohledávání, ale zachytávání je zřídka užitečné. Pokud je to přesto užitečné, bude muset být při používání kvantifikátoru v hledání zpět velmi opatrní: chamtivost spojená s absencí zpětného dozoru může poskytovat překvapující zachytávání. Z tohoto důvodu použijte spíše \K než pozitivní hledání zpět, když máte v zachytávací skupině pozitivního hledání zpět kvantifikátor (nebo ještě hůře několik).

Příklad negativního hledání vpřed:

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

Umístění na konci vzoru zabraňuje výběru uvnitř značky nebo stylu vloženého do souboru.

Kdykoliv je to možné, je vždy lepší vyhledávání „ukotvit“, aby se snížil počet kroků nezbytných k dosažení výsledku.

Rekurze

Zastoupení Význam
(?R) Rekurze celého vzoru
(?1) Rekurze jediného vzoru číslované zachytávací skupiny, zde skupina 1

Rekurze je vyvolání sebe sama. To je užitečné pro vyvážené dotazy, jako jsou řetězce v uvozovkách, které mohou obsahovat vložené řetězce v uvozovkách. Pokud tedy během zpracování řetězce mezi uvozovkami narazíme na začátek nového řetězce mezi uvozovkami, dobře víme, jak to udělat, a vyvoláme sebe sama. Pak máme podobný vzor:

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

Pro výběr řetězce mezi uvozovkami bez zastavení na vloženém řetězci:

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

Tuto šablonu lze také použít ke změně párů značek, které mohou být vloženy, například značek <div>.

Speciální znaky

Zastoupení Znak
\t tabulátor
\n konec řádku
\x20 (měkká) mezera
\xa0 tvrdá mezera

Metaznaky

Metaznaky jsou ty, které mají zvláštní význam pro modul regulárních výrazů. Dvanáct z nich musí předcházet řídící znak, zpětné lomítko (\), aby ztratily svůj zvláštní význam a stal se z nich opět normální znak:

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

Sedm dalších metaznaků nemusí předcházet zpětné lomítko (ale může bez jakýchkoliv dalších důsledků):

{ } ! < > = :

Speciální znaky ztratí svůj status, pokud jsou použity ve třídě (mezi lomenými závorkami []). Uzavírací lomená závorka a pomlčka mají ve třídě zvláštní status. Mimo třídu je pomlčka jednoduchým literálem, uzavírací lomená závorka zůstává metaznakem.

Lomítko (/) a křížek (nebo znak hash) (#) nejsou metaznaky, nemusejí mít řídící znak.

V některých nástrojích, jako je například regex101.com s modulem Python, mají dvojité uvozovky zvláštní status oddělovače a musí mít řídící znak, nebo se možnosti změní. Toto není případ editoru Calibre.

Režimy

(?s)
Způsobí, že tečka (.) bude odpovídat také znakům nového řádku
(?m)
Učiní, že kotvy ^ a $ budou odpovídat začátku a konci řádků namísto začátku a konce celého řetězce.