Le espressioni regolari (RE) sono usate comunemente per determinare se una stringa di caratteri corrisponde in qualche punto ad un insieme di stringhe. Esse permettono di specificare criteri di corrispondenza complessi, e per questo sono molto pi— flessibili rispetto alle stringhe di ricerca classiche.

&xwp; usa una combinazione di molti standard per la sintassi delle RE. Il livello di funzionalit… Š modellato per la massima parte vicino alle espressioni regolari estese (ERE) supportate dai programmi UNIX egrep e awk. Sono supportati inoltre alcuni miglioramenti introdotti dal POSIX, tipicamente presenti nei programmi UNIX ex e vi.

Vengono applicate le seguenti regole (si consulti Definizione BNF per una definizione formale):

Caratteri base

Insiemi di caratteri

Gli insiemi di caratteri sono specificati in parentesi angolari e definiscono un insieme di caratteri accettabili, o se possibile un insieme di caratteri non accettabili.

  [abc]   corrisponde con a, b, o c
  [^abc]  corrisponde con tutto ci• che non sia a, b, n‚ c
  [a-z]   Š l'insieme di caratteri tra 'a' e 'z'
  [a-j-t] Š l'insieme di caratteri tra 'a' e 't'
Per corrispondere con un carattere -, ^, ] in un elemento in parentesi, lo si preceda con un escape (backslash). Per esempio, [\])}] corrisponde a ], o ), o }. Ô anche possibile specificare una classe di caratteri POSIX completa in parentesi addizionali accoppiate a "due punti". In questo contesto,
  [:alnum:]   significa tutti i caratteri alfanumerici
              (in ASCII, Š come dire A-Za-z0-9)
  [:lower:]   significa tutti i caratteri alfabetici minuscoli
  ... etc.
Per esempio, specificando [[:alnum:] \t] verranno cercati tutti i caratteri alfanumerici pi— la tabulazione.

Tutti i caratteri

Il carattere "punto" (.) corrisponde a qualsiasi singolo carattere, senza curarsi di cosa questo sia. Per esempio, t.e corrisponde a the, ma non a tree.

Caratteri costitutivi di parole

Le ERE GNU definiscono il termine "carattere costitutivo di parole" per includere qualsiasi carattere alfanumerico, oppure il simbolo di sottolineatura _ per risparmiare un po' di digitazione.

\w Š una scorciatoia per tutti i caratteri costitutivi di parole ed equivale a [[:alnum:]_] o [A-Za-z0-9_]. \W vale per ogni carattere non costitutivo di parole ed equivale a [^[:alnum:]_] o [^A-Za-z0-9_].

Queste scorciatoie non sono valide all'interno di insiemi di caratteri tra parentesi quadre.

Non-carattere

Una estensione Microsoft alle ERE permette di dire "qualsiasi carattere tranne questo" precedendo il carattere scelto con una tilde ~. Questa Š una via breve equivalente alla specifica del carattere in parentesi quadre (~a Š pi— breve di [^a]). Per esempio, t~he corrisponde a tie, ma non a the.

Ancore

Le ancore specificano condizioni in cui potrebbe occorrere un'espressione:

  ^       corrisponde se si Š in inizio stringa
  $       corrisponde se si Š in fine stringa
  \`      alternativa GNU per ^
  \'      alternativa GNU per $
  \<      corrisponde all'inizio di una parola (o di una stringa)
  \>      corrisponde alla fine della parola (o della stringa)
  \B      corrisponde all'interno di una parola
  \y      corrisponde all'inizio o alla fine di una parola (o di una stringa)
Qui si intende per "parola" la definizione data sopra secondo il GNU.

Per esempio, ^xyz corrisponde con xyz solo se si trova all'inizio della linea. \<fred corrisponde a fred, freddy, ma non ad alfred.

Ripetizioni

Usando ?, +, {M}, o {M,N} Š possibile ricercare ripetizioni:

  ab?c      corrisponde con a, quindi con nessuna o un'occorrenza di b, quindi c
  ab+c      corrisponde con a, quindi con una o pi— occorrenze di b, quindi c
  ab*c      corrisponde con a, quindi con nessuna o pi— occorrenze di b, quindi c
  ab{M}c    corrisponde con a, quindi con M occorrenze di b, quindi con c
  ab{M,}c   corrisponde con a, quindi con M o pi— occorrenze di b, quindi con c
  ab{M,N}c  corrisponde con a, quindi con un numero di occorrenze di b tra M ed N, quindi con c

Nella lista sopra, M ed N sono numeri decimali, e se vengono dati entrambi, M dev'essere maggiore o uguale a N.

Per esempio, [A-Za-z_][A-Za-z0-9_]* corrisponde con ogni identificatore C o C++ lecito. \w{10,} corrisponde con almeno 10 caratteri costitutivi di parole. \<[0-9]{5}\> corrisponde con un numero a 5 cifre.

Alternanza

Ô possibile cercare una cosa o un'altra usando il simbolo |. Per esempio, fred|bill corrisponde a fred o bill. fred|bill|rob corrisponde con uno qualsiasi dei tre.

ERE annidate

Si possono usare parentesi per raggruppare ERE in sub-ERE, cosŤ che gli operatori come quelli di ripetizione o di alternanza possano esservi applicati. Per esempio, (frog|toad)+ corrisponde con una o pi— occorrenze di frog o toad.

L'annidamento pu• essere portato per molti livelli.

Retro-riferimenti

Ogni volta che viene trovata una ERE annidata, quello che viene trovato viene immagazzinato. Ô possibile fare un retro-riferimento (riferirsi a questo risultato) pi— avanti nella ERE principale (ossia, qualunque cosa sia stata incontrata prima dev'essere incontrato ancora) specificando un backslash con una cifra decimale. Si possono retro-riferire fino a 9 ERE annidate.

Per esempio, \2 significa che la seconda ERE annidata dev'essere incontrata un'altra volta. Come risultato, (a|b)(c|d)\2\1 corrisponder… ad acca, o adda, o bcca, o bddb.

Notare che l'esempio dato sopra non Š una scorciatoia per scrivere (a|b)(c|d)(c|d)(a|b). I retro-riferimenti non si riferiscono alle ERE, ma a ci• che a esse viene fatto corrispondere.

I retro-riferimenti possono essere fatti all'interno di ERE annidate per retro-riferire ERE annidate. Per esempio, frog|((a|bc)d\1) corrisponde a frog, o ada, o bcdbc, ma non a adbc.