Snabbreferens för regexp-syntax¶
Denna checklista sammanfattar de delar av regexp-motorn som används oftast eller är svårast att komma ihåg. Motorn finns tillgänglig i de flesta delar av calibre.
Teckenklasser¶
Teckenklasser är ett kortfattat sätt att representera olika grupper av tecken.
Exempel:
Notation |
Klass |
|
Gemener. Omfattar inte bokstäver med accenttecken eller ligaturer |
|
Gemener från a till z eller siffror från 0 till 9 |
|
Versaler, gemener eller ett bindestreck. För att inkludera bindestrecket i en klass måste du placera det i början eller slutet, så att det inte förväxlas med bindestrecket som anger ett teckenintervall |
|
Ett valfritt tecken utom en siffra. Cirkumflextecknet (^) i början av klassen utesluter tecknen i klassen (negerad klass) |
|
Gemena konsonanter. En klass kan ingå i en annan klass. Tecknen |
|
Alla bokstäver (inklusive utländska bokstäver med accenttecken). Förkortade klasser kan användas inom en klass |
Exempel:
<[^<>]+> to select an HTML tag
Förkortade teckenklasser¶
Notation |
Klass |
|
En siffra (samma som |
|
Ett valfritt icke-numeriskt tecken (samma som |
|
Ett alfanumeriskt tecken ( |
|
Ett valfritt tecken som inte är ett ordtecken |
|
Mellanslag, fast mellanslag, tabb, vagnretur |
|
Ett valfritt tecken som inte är ett blanktecken |
|
Ett valfritt tecken utom nyrad. Använd kryssrutan ”Punkt matchar allt” eller regexp-modifieraren |
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 minimi- och maximivärdet, inklusive båda gränserna |
|
Minst det angivna antalet förekomster, utan övre gräns |
|
Antal förekomster mellan 0 och maximivärdet, inklusive båda gränserna |
Girighet¶
Motorn för reguljära uttryck är som standard girig när kvantifierare används: den utökar matchningen så långt som möjligt. Detta leder ofta till överraskningar i början. Sätt ? efter en kvantifierare för att göra den lat. Undvik att använda två sådana i samma uttryck, eftersom resultatet kan vara oförutsägbart.
Se upp med nästlade kvantifierare, till exempel mönstret (a*)*, eftersom de kan öka bearbetningstiden exponentiellt.
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”.
Ankare¶
Ett ankare är ett sätt att matcha en logisk position i en sträng i stället för ett tecken. De användbaraste ankarna för textbehandling är:
\bBetecknar en ordgräns, dvs. en övergång från blanktecken till icke-blanktecken. Du kan till exempel använda
\bsurdför att matchathe surdmen 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 matchningens startposition till den aktuella positionen i mönstret. Vissa regexp-motorer (men inte calibres) tillåter inte lookbehind av varierande längd, särskilt med kvantifierare. Om dessa motorer stöder
\Kkan du kringgå begränsningen genom att skriva motsvarigheten till en positiv lookbehind av varierande längd.
Grupper¶
(expression)Fångstgrupp som lagrar matchningen. Den kan återanvändas senare i sök- eller ersättningsmönstret med
\n, därnär fångstgruppens ordningsnummer (från 1 i läsordning).(?:expression)Grupp som inte fångar markeringen
(?>expression)Atomgrupp: Så snart uttrycket har matchats fortsätter motorn. Om resten av mönstret sedan misslyckas går den inte tillbaka in i atomgruppen för att prova andra kombinationer. Atomgrupper fångar inte.
(?|expression)Grenåterställningsgrupp: alternativen i uttrycket delar samma gruppnummer
(?<name>expression)En grupp med namnet ”name”. Matchningen kan återanvändas senare i sökmönstret med
(?P=name)och i ersättningsmönstret 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) |
|
Negativ lookbehind (placeras före markeringen) |
Framåt- och bakåtblickande villkor förbrukar inga tecken, har längden noll och fångar inte. De är atomgrupper: så snart villkoret är uppfyllt fortsätter motorn, och om resten av mönstret misslyckas söker den inte bakåt inne i villkoret efter andra kombinationer.
När du söker efter flera matchningar i en sträng kan en lookbehind vid varje matchningsförsök undersöka tecknen före den aktuella startpositionen. I strängen 123 bör därför mönstret (?<=\d)\d (en siffra som föregås av en siffra) i teorin matcha 2 och 3. Däremot kan \d\K\d bara matcha 2, eftersom startpositionen efter den första matchningen är omedelbart före 3, och det inte finns tillräckligt med siffror för en andra matchning. På samma sätt fångar \d(\d) bara 2. I praktiken beter sig positiv lookbehind på samma sätt i calibres regexp-motor och matchar endast 2, i motsats till teorin.
Grupper kan placeras i lookaround-uttryck, men fångst är sällan användbar. Om det ändå behövs måste du vara mycket försiktig med kvantifierare i ett lookbehind-uttryck: girigheten i kombination med avsaknaden av backtracking kan ge oväntade fångster. Använd därför \K i stället för en positiv lookbehind när en fångstgrupp i lookbehind-uttrycket innehåller en eller flera kvantifierare.
Exempel på negativ lookahead:
(?![^<>{}]*[>}])
Placering i slutet av mönstret förhindrar markering inom en tagg eller ett format som är inbäddat 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¶
Notation |
Betydelse |
|
Rekursion av hela mönstret |
|
Rekursion av enbart mönstret i den numrerade fångstgruppen, här grupp 1 |
Rekursion innebär att något anropar sig självt. Detta är användbart för att söka efter balanserade strukturer, till exempel strängar inom citattecken som kan innehålla andra strängar inom citattecken. Om vi under bearbetningen av en sträng mellan dubbla citattecken stöter på början av en ny sådan sträng, kan vi anropa samma mönster igen. Då får 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 taggpar som kan nästlas, till exempel <div>-taggar.
Specialtecken¶
Notation |
Tecken |
|
tabulering |
|
radbrytning |
|
(brytbart) mellanslag |
|
fast mellanslag |
Metatecken¶
Metatecken har en särskild betydelse för regexp-motorn. Av dessa måste tolv föregås av ett escape-tecken, bakstrecket (\), för att förlora sin särskilda betydelse och bli vanliga tecken igen:
^ . [ ] $ ( ) * + ? | \
Sju andra metatecken behöver inte föregås av ett bakstreck, men kan göra det utan att betydelsen ändras:
{ } ! < > = :
Specialtecken förlorar sin särskilda betydelse om de används i en klass (mellan hakparenteser []). Den avslutande hakparentesen och bindestrecket har en särskild status i en klass. Utanför klassen är bindestrecket ett vanligt tecken, medan den avslutande hakparentesen förblir ett metatecken.
Snedstreck (/) och nummertecken (eller hashtecken) (#) är inte metatecken, de behöver inte föregås av ett escape-tecken.
I vissa verktyg, som regex101.com med Python-motorn, har dubbla citattecken den speciella statusen för avskiljare och måste föregås av omvänt snedstreck, eller alternativen ändras. Detta är inte fallet i redigeraren för calibre.
Lägen¶
(?s)Gör att punkten (
.) även matchar nyradstecken(?m)Gör så att ankarna
^och$matchar början och slutet av rader i stället för början och slutet av hela strängen.
