Snabbreferens för regexp-syntax¶
Denna checklista sammanfattar de vanligaste/svåra att komma ihåg delar av regexp-motorn som finns i de flesta delar av calibre.
Teckenklasser¶
Teckenklasser är användbara för att representera olika grupper av tecken, kortfattat.
Exempel:
Representation |
Klass |
|
Gemener. Innehåller inte tecken med accentmärke och ligaturer |
|
Gemener från a till z eller siffror från 0 till 9 |
|
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 |
|
Alla tecken utom en siffra. Insättningstecknet (^) placerad i början av klassen exkluderar tecknena i klassen (kompletterad klass) |
|
Konsonanterna för gemener. En klass kan ingå i en klass. Tecknet |
|
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 |
|
En siffra (samma som |
|
Alla icke-numeriska tecken (samma som |
|
Ett alfanumeriskt tecken ( |
|
Alla ”icke-ordet” tecken |
|
Blanksteg, icke-brytande blanksteg, tab, returrad |
|
Alla ”icke-whitespace” tecken |
|
Alla tecken utom nyrad. Använd kryssrutan ”pricka alla” eller regexp-medifieraren |
Kvantifierare¶
Kvantifierare |
** Antal förekomster av uttrycket som föregår kvantifieraren ** |
|
0 eller 1 förekomst av uttrycket. Samma som |
|
1 eller flera förekomster av uttrycket. Samma som |
|
0, 1 eller flera förekomster av uttrycket. Samma som |
|
Exakt n förekomster av uttrycket |
|
Antal förekomster mellan de minsta och högsta värdena som ingår |
|
Antal förekomster mellan det lägsta värdet och det oändliga |
|
Antal förekomster mellan 0 och det högsta värdet som ingår |
Girig¶
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.
Se upp för häckande kvantifierare, till exempel mönstret (a*)*
eftersom det exponentiellt ökar bearbetningstiden.
Alternering¶
Tecknet |
i ett reguljärt uttryck är ett logiskt OR
. 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 användbaraste ankare för textbehandling är:
\b
Betecknar en ordgräns, dvs. en övergång från utrymme till icke-utrymme tecken. Du kan till exempel använda``bsurd`` för att matcha
the surd
men inteabsurd
.^
Matchar början av en rad (i flerradsläge, vilket är standard)
$
Matchar slutet av en rad (i flerradsläge, vilket är standard)
\K
Återställer startpositionen för valet till dess position i mönstret. Vissa regexp-motorer (men inte calibre) tillåter inte lookbehind av varierande längd, särskilt med kvantifierare. När du kan använda
\K
med dessa motorer låter det dig också bli av med denna gräns genom att skriva motsvarande ett positivt lookbehind variabel längd.
Grupper¶
(uttryck)
Fångstgrupp, som lagrar urvalet och kan återanropas senare i sök eller ersätt mönstren med
\n
, därn
är sekvensnumret för fångstgruppen (som börjar vid 1 i läsordningen)(?:expression)
Grupp som inte fångar markeringen
(?>expression)
Atomic Group: Så snart uttrycket är uppfyllt passerar regexp-motorn, och om resten av mönstret misslyckas kommer det inte att gå tillbaka för att testa andra kombinationer med uttrycket. Atomgrupper fångar inte.
(?|expression)
Gruppåterställningsgrupp: grenarna för alternationerna som ingår i uttrycket delar samma gruppnummer
(?<name>expression)
Grupp som heter ”namn”. Urvalet kan återanropas senare i sök-mönstret med
(?P=namn)
och i ersätt med\g<name>
. Två olika grupper kan använda samma namn.
Lookarounds¶
Lookaround |
Betydelse |
|
Positiv lookahead (placeras efter markeringen) |
|
Negativ lookahead (placeras efter markeringen) |
|
Positiv lookbehind (placeras före markeringen) |
|
Negativt lookbehind (placeras före markeringen) |
Lookaheads och lookbehinds konsumerar inte tecken, de är noll långa och fångar inte. De är atomgrupper: så snart påståendet är tillfredsställt passerar regexp-motorn, och om resten av mönstret misslyckas kommer det inte att spåra inuti sökningen för att testa andra kombinationer.
När du letar efter flera matchningar i en sträng, vid startpositionen för varje matchförsök, kan en lookbehind inspektera tecknen före den aktuella positionen. Därför, på strängen 123, bör mönstret (?<=\d)\d
(en siffra som föregås av en siffra) i teorin välja 2 och 3. Å andra sidan, \d\K\d
kan bara välja 2, eftersom startpositionen efter det första valet är omedelbart före 3, och det inte finns tillräckligt med siffror för en andra match. På samma sätt fångar \d(\d)
bara 2. I calibres regexp-motorövning beter sig det positiva utseendet på samma sätt och väljer endast 2, i motsats till teorin.
Grupper kan placeras i lookarounds, men fånga är sällan användbart. Icke desto mindre, om det är användbart, kommer det att vara nödvändigt att vara mycket försiktig när man använder en kvantifierare i en lookbehind: girigheten som är associerad med frånvaron av backtracking kan ge en överraskande fångst. Använd därför \K
i stället för en positiv lookbehind när du har en kvantifierare (eller värre, flera) i en fångande grupp av den positiva lookbehind.
Exempel på negativ lookahead:
(?![^<>{}]*[>}])
Placeras i slutet av mönstret förhindrar att välja inom en tagg eller ett format inbäddad i filen.
När det är möjligt är det alltid bättre att ”förankra” lookarounds, för att minska antalet steg som krävs för att få resultatet.
Rekursion¶
Representation |
Betydelse |
|
Rekursion av hela mönstret |
|
Rekursion av det enda mönstret i den numrerade fångstgruppen, här grupp 1 |
Rekursion anropar sig själv. Detta är användbart för balanserade förfrågningar, till exempel citerade strängar, som kan innehålla inbäddade citattecken. Således, om vi under bearbetningen 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 anropar 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 |
|
tabulering |
|
radbrytning |
|
(brytbart) mellanrum |
|
icke-brytbart mellanrum |
Metatecken¶
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 citattecken 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.