Snabbreferens för regexp-syntax

Den här checklistan sammanfattar de mest använda/svåra att komma ihåg delar av regexp-motorn som finns i calibre redigerings- och omvandlingssök/ersättningsfunktionerna. Observera att denna motor är kraftfullare än den grundläggande regexp-motorn som används i resten av calibre.

Teckenklasser

Teckenklasser är användbara för att representera olika grupper av tecken, kortfattat.

Exempel:

Representation Klass
[a-z] Gemener. Innehåller inte tecken med accentmärke och ligaturer
[a-z0-9] Gemener från a till z eller siffror från 0 till 9
[A-Za-z-] Versaler eller gemener eller ett streck. För att inkludera bindestreck i en klass måste du lägga den i början eller i slutet för att inte förvirra den med bindestrecket som anger ett antal tecken
[^0-9] Alla tecken utom en siffra. Caret (^) placerad i klassens början utesluter klassens tecken (kompletterad klass)
[[a-z]--[aeiouy]] Konsonanterna för gemener. En klass kan ingå i en klass. Tecknet -- utesluter vad som följer dem
[\w--[\d_]] Alla bokstäver (inklusive utländska accenttecken). Förkortade klasser kan användas inom en klass

Exempel:

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

Stenografiska karaktärsklasser

Representation Klass
\d En siffra (samma som [0-9])
\D Alla icke-numeriska tecken (samma som [^0-9])
\w Ett alfanumeriskt tecken ([a-zA-Z0-9]) inklusive tecken med accentmärke och ligaturer
\W Alla ”icke-ordet” tecken
\s Mellanslag, icke-brytande mellanslag, tab, returrad
\S Alla ”non-whitespace” tecken
. Alla tecken utom nyrad. Använd kryssrutan “pricka alla” eller regexp-medifieraren (?s) för att inkludera nyradstecken.

Kvantifierarna

Kvantifierare ** Antal förekomster av uttrycket som föregår kvantifieraren **
? 0 eller 1 förekomst av uttrycket. Samma som {0,1}
+ 1 eller flera förekomster av uttrycket. Samma som {1,}
* 0, 1 eller flera förekomster av uttrycket. Samma som {0,}
{n} Exakt n förekomster av uttrycket
{min,max} Antal förekomster mellan de minsta och högsta värdena som ingår
{min,} Antal förekomster mellan det lägsta värdet och det oändliga
{,max} Antal förekomster mellan 0 och det högsta värdet som ingår

Greed

Som standard, med kvantifierare, är den reguljär uttrycksmotorn girig: den utökar valet så mycket som möjligt. Detta orsakar ofta överraskningar, i början. ”?” följer en kvantifierare för att göra den lat. Undvik att sätta två i samma uttryck, resultatet kan vara oförutsägbart.

Beware of nesting quantifiers, for example, the pattern (a*)*, as it exponentially increases processing time.

Alternering

Tecknet | i ett reguljärt uttryck är en logisk ELLER. Det betyder att antingen föregående eller följande uttryck kan matcha.

Uteslutning

Metod 1

pattern_to_exclude(*SKIP)(*FAIL)|pattern_to_select

Exempel:

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

väljer Blabla, i strängarna Blabla eller ”Blabla eller Blabla”, men inte i ”Blabla”.

Metod 2

pattern_to_exclude\K|(pattern_to_select)

"Blabla"\K|(Blabla)

väljer Blabla, i strängarna Blabla eller ”Blabla eller Blabla”, men inte i ”Blabla”.

Ankaren

Ett ankare är ett sätt att matcha en logisk plats i en sträng, snarare än ett tecken. De mest användbara ankare för textbehandling är:

\b
Betecknar en ordgräns, d.v.s. en övergång från utrymme till icke-utrymme tecken. Du kan till exempel använda``bsurd`` för att matcha the surd men inte absurd.
^
Matchar början av en rad (i flerradsläge, vilket är standard)
$
Matchar slutet av en rad (i flerradsläge, vilket är standard)
\K
Resets the start position of the selection to its position in the pattern. Some regexp engines (but not calibre) do not allow lookbehind of variable length, especially with quantifiers. When you can use \K with these engines, it also allows you to get rid of this limit by writing the equivalent of a positive lookbehind of variable length.

Grupper

(uttryck)
Fångar grupp, som lagrar valet och kan återkallas senare i sök eller ersätt mönster med \n, där n är sekvensnumret för fångstgruppen (börjar vid 1 i läsordning)
(?:expression)
Grupp som inte fångar markeringen
(?>expression)
Atomic Group: As soon as the expression is satisfied, the regexp engine passes, and if the rest of the pattern fails, it will not backtrack to try other combinations with the expression. Atomic groups do not capture.
(?|expression)
Gruppåterställningsgrupp: grenarna för alternationerna som ingår i uttrycket delar samma gruppnummer
(?<name>expression)
Grupp som heter ”namn”. Valet kan återkallas senare i sök-mönstret genom (?P=namn) och i *ersätt * med \g<name>. Två olika grupper kan använda samma namn.

Lookarounds

Lookaround Betydelse
?= Positive lookahead (to be placed after the selection)
?! Negative lookahead (to be placed after the selection)
?<= Positive lookbehind (to be placed before the selection)
?<! Negative lookbehind (to be placed before the selection)

Lookaheads and lookbehinds do not consume characters, they are zero length and do not capture. They are atomic groups: as soon as the assertion is satisfied, the regexp engine passes, and if the rest of the pattern fails, it will not backtrack inside the lookaround to try other combinations.

When looking for multiple matches in a string, at the starting position of each match attempt, a lookbehind can inspect the characters before the current position. Therefore, on the string 123, the pattern (?<=\d)\d (a digit preceded by a digit) should, in theory, select 2 and 3. On the other hand, \d\K\d can only select 2, because the starting position after the first selection is immediately before 3, and there are not enough digits for a second match. Similarly, \d(\d) only captures 2. In calibre’s regexp engine practice, the positive lookbehind behaves in the same way, and selects only 2, contrary to theory.

Groups can be placed inside lookarounds, but capture is rarely useful. Nevertheless, if it is useful, it will be necessary to be very careful in the use of a quantifier in a lookbehind: the greed associated with the absence of backtracking can give a surprising capture. For this reason, use \K rather than a positive lookbehind when you have a quantifier (or worse, several) in a capturing group of the positive lookbehind.

Example of negative lookahead:

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

Placeras i slutet av mönstret förhindrar att välja inom en tagg eller ett format inbäddad i filen.

Whenever possible, it is always better to ”anchor” the lookarounds, to reduce the number of steps necessary to obtain the result.

Rekursion

Representation Betydelse
(?R) Rekursion av hela mönstret
(?1) Rekursion av det enda mönstret i den numrerade fångstgruppen, här grupp 1

Rekursion kallar sig själv. Detta är användbart för balanserade förfrågningar, till exempel citerade strängar, som kan innehålla inbäddade citerade strängar. Således, om vi under behandlingen av en sträng mellan dubbla citattecken stöter på början av en ny sträng mellan dubbla citattecken, vet vi hur vi ska göra, och vi kallar oss själva. Då har vi ett mönster som:

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

För att välja en sträng mellan dubbla citattecken utan att stanna på en inbäddad sträng:

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

Denna mall kan också användas för att ändra par av taggar som kan bäddas in, till exempel <div> taggar.

Speciella tecken

Representation Tecken
\t tabulering
\n radbrytning
\x20 (breakable) space
\xa0 no-break space

Meta-tecken

Metatecken är de som har en speciell betydelse för regexp-motorn. Av dessa måste tolv föregås av ett escape-tecken, bakstrecket (”” ), för att förlora sin speciella mening och bli ett vanligt tecken igen:

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

Sju andra metatecken behöver inte föregås av ett bakstreck (men kan vara utan någon annan konsekvens):

{ } ! < > = :

Specialtecken förlorar sin status om de används i en klass (mellan klamrar []). Stängningsklammern och bindestrecket har en särskild status i en klass. Utanför klassen är bindestrecket en enkel bokstav, stängningsklammern förblir ett metatecken.

Snedstreck (/) och nummertecken (eller hashtecken) (#) är inte metatecken, de behöver inte undgås.

I vissa verktyg, som regex101.com med Python-motorn har dubbla citat den speciella statusen för avskiljare, och måste rymmas, eller alternativen ändras. Detta är inte fallet i redigeraren för calibre.

Lägen

(?s)
Orsakar punkten (.) att matcha nyradstecken också
(?m)
Gör så att ankarna ^ och $ matchar början och slutet av rader istället för början och slutet av hela strängen.