Základy vyhledávání prostřednictvím 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 většině součástí 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.