Quick reference voor regexp syntax

Deze checklist vat de meest gebruikte/moeilijk te onthouden delen van de regexp engine, beschikbaar in de meeste delen van calibre, samen.

Karakter klassen

Tekenklassen zijn handig om verschillende groepen karakters samen te stellen, kort en bondig.

Voorbeelden:

Vertegenwoordiging

Klasse

[a-z]

Kleine letters. Bevat geen tekens met accentmarkering en ligaturen

[a-z0-9]

Kleine letters van a tot z of cijfers van 0 tot 9

[A-Za-z-]

Hoofdletters of kleine letters, of een streepje. Om het streepje in een klasse op te nemen, moet u het aan het begin of aan het einde plaatsen om het niet te verwarren met het koppelteken dat een reeks tekens specificeert

[^0-9]

Elk teken behalve een cijfer. Het caret (^) aan het begin van de klasse sluit de karakters van de klasse uit (gecomplementeerde klasse)

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

De medeklinkers in kleine letters. Een klas kan in een klas worden opgenomen. De karakters -- sluiten uit wat hen volgt

[\w--[\d_]]

Alle letters (inclusief tekens met buitenlandse accenten). Afgekorte klassen kunnen binnen een klas worden gebruikt

Voorbeeld:

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

Steno tekenklassen

Vertegenwoordiging

Klasse

\d

Een cijfer (hetzelfde als [0-9])

\D

Elk niet-numeriek karakter (hetzelfde als [^0-9])

\w

Een alfanumeriek karakter ([a-zA-Z0-9]) inbegrepen karakters met accent en ligatuur

\W

Elk “niet-woord”karakter

\s

Spatie, harde spatie, tab, nieuweregelteken

\S

Elk “niet blanco ruimte” karakter

.

Elk karakter uitgezonderd nieuwe regel. Gebruik het “dot all” aankruisvakje of de (?s) regexp modifier om het nieuwe regel karakter mee te tellen.

De quantifiers

Quantifier

Aantal keren dat de uitdrukking voorkomt voor de quantifier

?

0 of 1 keer voorkomen van de uitdrukking. Hetzelfde als {0,1}

+

1 of meer keer voorkomen van de uitdrukking. Hetzelfde als {1,}

*

0, 1 of meer keer voorkomen van de uitdrukking. Hetzelfde als {0,}

{n}

Exact n keer voorkomen van de uitdrukking

{min,max}

Aantal keer voorkomen tussen de minimum en maximum waarden inbegrepen

{min,}

Aantal keren voorkomen tussen de minimum waarde inbegrepen en oneindig

{,max}

Aantal keren voorkomen tussen 0 en de maximum waarde inbegrepen

Hebzucht

Standaard, met quantifiers, is de regular expression engine hebzuchtig: hij breidt de selectie zo ver mogelijk uit. Dit geeft dikwijls verassingen, in het begin. ? volgt een quantifier om hem lui te maken. Vermijd twee ervan in dezelfde uitdrukking, het resultaat kan onvoorspelbaar zijn.

Let op met het nesten van quantifiers, bv het patroon (a*)*, omdat het de verwerkingstijd exponentieel verhoogt.

Afwisseling

Het | karakter in een regular expression is een logische OR. Het betekent dat ofwel de voorgaande ofwel de navolgende uitdrukking kan overeenkomen.

Uitsluiting

Methode 1

pattern_to_exclude(*SKIP)(*FAIL)|pattern_to_select

Voorbeeld:

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

selecteert Blabla, in de strings Blabla of “Blabla of Blabla”, maar niet in “Blabla”.

Methode 2

pattern_to_exclude\K|(pattern_to_select)

"Blabla"\K|(Blabla)

selecteert Blabla, in de strings Blabla of “Blabla of Blabla”, maar niet in “Blabla”.

Ankers

Een anker is een manier om een logische locatie in een string te matchen, eerder dan een karakter. De nuttigste ankers voor tekstverwerking zijn:

\b

Geeft een woordgrens aan, bv een overgang van een spatie naar een niet blanco ruimte karakter. U kan bv \bsurd gebruiken om overeen te komen met the surd maar niet absurd.

^

Komt overeen met het begin van een regel (in multi-regel modus, wat standaard is)

$

Komt overeen met het einde van een regel (in multi-regel modus, wat standaard is)

\K

Reset de start positie van de selectie naar z’n positie in het patroon. Sommige regex engines (maar niet calibre) laten geen lookbehind of variabele lengte toe, zeker met quantifiers. Als u \K kan gebruiken bij deze engines, laat het u ook toe om van deze beperking vanaf te raken door het equivalent van een positieve lookbehind van variabele lengte te schrijven.

Groepen

(expression)

Vang groep, die de selectie bewaart en later terug opgeroepen kan worden in de search or replace patronen met \n, waar n het volgnummer is van de vang groep (beginnend bij 1 in leesvolgorde)

(?:expression)

Groep die de selectie niet vangt

(?>expression)

Atomic Group: Zo gauw aan de uitdrukking voldaan is, geeft de regexp engine door, en als de rest van het patroon faalt, zal hij niet terug gaan om andere combinaties met de uitdrukking te proberen. Atomic groepen vangen niet.

(?|expression)

Branch reset groep: de branches van de alternaties inbegrepen in de uitdrukking delen dezelfde groep nummers

(?<name>expression)

Groep “naam” genoemd. De selectie kan later terug opgeroepen worden in het zoek patroon door (?P=name) en in de vervang door \g<name>. Twee verschillende groepen kunnen dezelfde naam gebruiken.

Lookarounds

Lookaround

Meaning

?=

Positieve lookahead (na de selectie te plaatsen)

?!

Negatieve lookahead (na de selectie te plaatsen)

?<=

Positieve lookbehind (voor de selectie te plaatsen)

?<!

Negatieve lookbehind (voor de selectie te plaatsen)

Lookaheads en lookbehinds verbruiken geen karakters, ze hebben zero lengte en vangen niet. Het zijn atomic groepen: zo gauw aan de stelling voldaan is, geeft de regexp engine door, en als de rest van het patroon faalt, zal hij niet terug gaan in de lookaround om andere combinaties te proberen.

Bij het zoeken naar meerdere overeenkomsten in een string, kan een lookbehind, bij de startpositie van elke poging, de karakters inspecteren voor de huidige positie. Dus, in de string 123, het patroon (?<=\d)\d (een cijfer voorafgegaan door een cijfer) zou, in theorie, 2 en 3 moeten kiezen. Anderzijds, \d\K\d kan enkel 2 kiezen omdat de startpositie na de eerste selectie onmiddellijk voor 3 is en er niet genoeg cijfers zijn voor een tweede overeenkomst. Gelijkaardig, \d(\d) vangt enkel 2. In calibre’s regexp engine praktijk gedraagt de positieve lookbehind zich op dezelfde manier en kiest enkel 2, in tegenstelling tot de theorie.

Groepen kunnen in lookarounds geplaatst worden, maar vangen is zelden bruikbaar. Niettegenstaande, als het bruikbaar is, is het nodig om zeer zorgvuldig te zijn in het gebruik van een quantifier in een lookbehind: de hebzucht die komt met de afwezigheid van backtracking kan een verrassende vangst geven. Hierom, gebruik eerder \K dan een positieve lookbehind als je een quantifier hebt (of erger, meerdere) in een vang groep van de positieve lookbehind.

Voorbeeld van een negatieve lookahead:

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

Voorkomt het selecteren binnenin een tag of stijl in een bestand indien aan het einde van het patroon geplaatst.

Wanneer mogelijk, is het altijd beter om de lookarounds the ‘ankeren”, om het aantal stappen om het resultaat te verkrijgen, te verkleinen.

Recursie

Vertegenwoordiging

Meaning

(?R)

Recursie van het gehele patroon

(?1)

Recursie van het enige patroon van de genummerde vang groep, hier groep 1

Recursie is zichzelf roepen. Dit is nuttig voor gebalanceerde queries, zoals quoted strings, die binnenin quoted strings kunnen bevatten. Dus, als tijdens het verwerken van een string tussen dubbele aanhalingstekens, we het begin van een andere string tussen dubbele aanhalingstekens tegen komen, weten we wat te doen en we roepen onszelf. Dan hebben we een patroon zoals:

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

Om een string te selecteren tussen dubbele aanhalingstekens zonder te stoppen voor een string daar binnenin:

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

Deze template kan ook gebruikt worden om tag paren te wijzigen die ergens binnenin staan, zoals <div> tags.

Speciale karakters

Vertegenwoordiging

Character

\t

tabulation

\n

line break

\x20

(zachte) spatie

\xa0

harde spatie

Meta-karakters

Meta-karakters zijn diegene die een speciale betekenis hebben voor de regexp engine. Van deze moeten er 12 voorafgegaan worden door een escape karakter, de backslash (\), om hun speciale betekenis te verliezen en terug een gewoon karakter te worden:

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

Zeven andere meta-karakters moeten niet door een backslash vooraf gegaan worden (maar het kan zonder gevolgen):

{ } ! < > = :

Speciale karakters verliezen hun status als ze in een class gebruikt worden (tussen haakjes []). Het sluitende haakje en het streepje hebben een speciale betekenis in een class. Buiten de class is het streepje gewoon een streepje, het sluitend haakje blijft een meta-karakter.

De slash (/) en het hekje (of kardinaalteken) (#) zijn geen meta-karakters, zij moeten niet voorafgegaan worden door een escape karakter.

In sommige tools, zoals regex101.com in de Python engine, hebben dubbele aanhalingstekens de speciale status van scheidingsteken, en moeten voorafgegaan worden door een escape teken, of de opties moeten aangepast worden. Dit is niet het geval in de calibre editor.

Modes

(?s)

Zorgt ervoor dat het punt (.) ook met nieuwe lijn karakters overeenkomt

(?m)

Laat de ^ en $ ankers overeenkomen met het begin en einde van regels ipv het begin en einde van de hele string.