Riferimenti rapidi sulla sintassi regex

Questo elenco riassume le parti più comunemente usate/più difficili da ricordare del motore regex disponibile in molte delle parti di calibre.

Classi di caratteri

Le classi di caratteri sono utili per rappresentare gruppi diversi di caratteri in modo conciso.

Esempi:

Rappresentazione

Classe

[a-z]

Lettere minuscole. Non include caratteri accentati, segnati e legature

[a-z0-9]

Lettere minuscole dalla a alla z o numeri da 0 a 9

[A-Za-z-]

Lettere maiuscole, minuscole o un trattino. Per includere il trattino in una classe devi metterlo all’inizio oppure alla fine, per non confonderlo con quello che specifica un intervallo di caratteri.

[^0-9]

Qualsiasi carattere tranne una cifra. Il segno di omissione (^) all’inizio della classe esclude i caratteri della classe (classe complementare)

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

Consonanti minuscole. Una classe può essere inclusa in una classe. I caratteri escludono ciò che li segue

[\w--[\d_]]

Tutte le lettere (inclusi i caratteri accentati stranieri). Le classi abbreviate possono essere utilizzate all’interno di una classe

Esempio:

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

Classi di caratteri abbreviate

Rappresentazione

Classe

\d

Una cifra (uguale a [0-9])

\D

Ogni carattere non numerico (uguale a [^0-9])

\w

Un carattere alfanumerico ([a-zA-Z0-9]) inclusi caratteri con accenti, segni e legature.

\W

Qualsiasi carattere «non-parola»

\s

Spazio, spazio unificatore, rientro (tabulazione), testo a capo

\S

Qualsiasi carattere «non-vuoto»

.

Qualsiasi carattere eccetto newline. Usa la casella «Il punto vale tutto» o il modificatore regex (?s) per includere il carattere newline.

I quantificatori

Quantificatore

Numero di occorrenze dell’espressione che precede il quantificatore

?

0 o 1 occorrenze dell’espressione. Uguale a {0,1}

+

1 o più occorrenze dell’espressione. Uguale a {1,}

*

0, 1 o più occorrenze dell’espressione. Uguale a {0,}

{n}

Esattamente n occorrenze dell’espressione

{min,max}

Un numero di occorrenze compreso tra i valori minimo e massimo inclusi

{min,}

Un numero di occorrenze compreso tra il valore minimo e l’infinito

{,max}

Un numero di occorrenze compreso tra 0 e il valore massimo incluso

Voracità

Per impostazione predefinita, con i quantificatori, il motore delle espressioni regolari è vorace (greedy): estende la selezione il più possibile. Questo causa delle sorprese all’inizio. ? segue un quantificatore per renderlo pigro (lazy). Evita di metterne due nella stessa espressione, i risultati possono essere imprevedibili.

Fai attenzione nel nidificare i quantificatori, come ad esempio nell’espressione (a*)*, perché fare ciò aumenta esponenzialmente il tempo di elaborazione.

Alternative

Il carattere | in un’espressione regolare è un OR logico. Significa che verrà cercata una corrispondenza o per l’espressione precedente o per quella seguente.

Esclusione

Metodo 1

schema_da_escludere(*SKIP)(*FAIL)|schema_da_selezionare

Esempio:

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

seleziona Blabla, nelle stringhe Blabla o «Blabla or Blabla», ma non in «Blabla».

Metodo 2

schema_da_escludere\K|(schema_da_selezionare)

"Blabla"\K|(Blabla)

seleziona Blabla, nelle stringhe Blabla o «Blabla or Blabla», ma non in «Blabla».

Ancoraggi

Un ancoraggio è un modo di trovare una posizione logica in una stringa, invece di un carattere. Gli ancoraggi più utili per l’elaborazione del testo sono:

\b

Indica il confine di una parola, ovvero una transizione da un carattere spazio a uno non-spazio. Per esempio, puoi usare \bcerto per trovare di certo ma non concerto.

^

Trova l’inizio di una riga (in modalità multilinea, che è quella predefinita)

$

Trova la fine di una riga (in modalità multilinea, che è quella predefinita)

\K

Ripristina la posizione di partenza della selezione alla sua posizione nello schema. Alcuni motori di regex (ma non quello di calibre) non permettono lookbehind di lunghezza variabile, specialmente con i quantificatori. Se puoi utilizzare \K con questi motori, puoi anche aggirare questa limitazione scrivendo l’equivalente di un lookbehind positivo di lunghezza variabile.

Gruppi

(espressione)

Gruppo di cattura, che conserva la selezione e può essere richiamato in seguito nelle espressioni cerca e sostituisci usando \n, dove n è il numero di sequenza del gruppo di cattura (a partire da 1 in ordine di lettura)

(?:espressione)

Gruppo che non cattura la selezione

(?>espressione)

Gruppo Atomico: Non appena l’espressione è soddisfatta, il motore regex prosegue, e se il resto dello schema fallisce, non tornerà indietro per provare altre combinazioni con l’espressione. I gruppi atomici non sono di cattura.

(?|espressione)

Gruppo branch reset: i rami (branches) delle alternative incluse nell’espressione condividono gli stessi numeri di gruppo

(?<nome>espressione)

Gruppo chiamato “nome”. La selezione può essere richiamata in seguito nell’espressione cerca con (?P=nome) e in quella sostituisci con \g<nome>. Due gruppi diversi possono usare lo stesso nome.

Lookaround

Lookaround

Significato

?=

Lookahead positivo (da inserire dopo la selezione)

?!

Lookahead negativo (da inserire dopo la selezione)

?<=

Lookbehind positivo (da inserire prima della selezione)

?<!

Lookbehind negativo (da inserire prima della selezione)

I lookahead e i lookbehind non consumano caratteri, hanno lunghezza zero e non catturano. Sono gruppi atomici: non appena l’asserzione è soddisfatta, il motore regex prosegue, e se il resto dello schema fallisce, non tornerà indietro all’interno del lookaround per provare altre combinazioni.

Quando si cercano più corrispondenze in una stringa, alla posizione di partenza di ogni tentativo di corrispondenza, un lookbehind può esaminare i caratteri precedenti la posizione corrente. Di conseguenza, nella stringa 123, lo schema (?<=\d)\d (una cifra preceduta da una cifra) dovrebbe in teoria selezionare 2 e 3. D’altra parte \d\K\d può solo selezionare 2, perché la posizione di partenza dopo la prima selezione si trova immediatamente prima del 3, e non ci sono abbastanza cifre per una seconda corrispondenza. Similmente, \d(\d) cattura solo 2. Nella pratica del motore regex di calibre, il lookbehind positivo si comporta allo stesso modo, e seleziona solo 2, contrariamente alla teoria.

I gruppi possono essere inseriti all’interno dei lookaround, ma la cattura è raramente utile. Cionondiméno, se necessaria, bisognerà fare molta attenzione nell’uso di un quantificatore in un lookbehind: la voracità associata al non tornare indietro puo dare una cattura sorprendente. Per questa ragione, usa \K piuttosto che un lookbehind positivo quando hai un quantificatore (o peggio, più di uno) in un gruppo di cattura del lookbehind positivo.

Esempio di lookahead negativo:

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

Inserito alla fine dell’espressione impedisce la selezione dentro un tag o uno stile incorporato nel file.

Quando possibile, è sempre meglio «ancorare» i lookaround, per ridurre il numero di passi necessari ad ottenere il risultato.

Ricorsività

Rappresentazione

Significato

(?R)

Ricorsività dell’intero schema

(?1)

Ricorsività solamente dello schema del gruppo di cattura numerato, qui il gruppo 1

Ricorsività qui significa invocare se stessi. Ciò è utile per richieste equilibrate, come le stringhe tra virgolette, che possono avere incorporate stringhe tra virgolette. Quindi, se durante l’elaborazione di una stringa tra virgolette doppie incontriamo l’inizio di una nuova stringa compresa tra due virgolette doppie, sappiamo cosa fare, e invochiamo noi stessi. E abbiamo uno schema di questo tipo:

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

Per selezionare una stringa compresa tra due virgolette doppie senza fermarci su una stringa incorporata:

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

Questo modello può anche essere usato per modificare coppie di tag che possono essere incorporati, come i tag <div>.

Caratteri speciali

Rappresentazione

Carattere

\t

rientro (tabulazione)

\n

interruzione di linea

\x20

spazio (divisibile)

\xa0

spazio unificatore (nbsp)

Metacaratteri

I metacaratteri sono quelli che hanno un significato speciale per il motore di regex. Di questi, dodici devono essere preceduti da un carattere di escape, la barra rovesciata (\), per perdere il loro significato speciale e ridiventare caratteri normali:

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

Sette altri metacaratteri non hanno bisogno di essere preceduti da una barra rovesciata (ma lo possono essere senza altre conseguenze):

{ } ! < > = :

I caratteri speciali perdono il loro stato se vengono usati dentro una classe (tra le parentesi []). La parentesi di chiusura e il trattino hanno uno stato speciale dentro una classe. Fuori dalla classe, il trattino è una semplice lettera, mentre la parentesi di chiusura rimane un metacarattere.

La barra (/) e il cancelletto (o hashtag) (#) non sono metacaratteri, non hanno bisogno del carattere di escape.

In alcuni strumenti, come regex101.com con il motore Python, le virgolette doppie hanno lo stato speciale di separatore e devono essere precedute dal carattere di escape, oppure vanno cambiate le opzioni. Così non è nell’editor di calibre.

Modalità

(?s)

Fa in modo che il punto (.) trovi anche i caratteri newline

(?m)

Fa in modo che gli ancoraggi ^ e $ trovino l’inizio e la fine delle righe invece dell’inizio e della fine dell’intera stringa.