table of contents
other languages
other sections
REGEX(7) | Miscellaneous Information Manual | REGEX(7) |
NOME¶
regex - espressioni regolari POSIX.2DESCRIZIONE¶
Le espressioni regolari (dette "ER"), così come definite da POSIX.2, appaiono in due forme: ER moderne (approssimativamente, quelle di egrep; POSIX.2 le definisce ER "estese") e ER obsolete (approssimativamente quelle di ed(1); ER di "base" in POSIX.2). Le ER obsolete esistono per compatibilità con alcuni vecchi programmi, e verranno discusse alla fine. POSIX.2 lascia aperti alcuni aspetti della sintassi e della semantica delle ER: `(!)' denota scelte che potrebbero non essere completamente portabili ad altre implementazioni di POSIX.2. Una ER (moderna) è una(!) diramazione o più diramazioni non vuote*†, diramazioni, separati da `|'. L'ER corrisponde a qualsiasi cosa che corrisponda ad una delle diramazioni. Una diramazione è formata da uno(!) o più pezzi concatenati. Corrisponde ad una corrispondenza per il primo pezzo, seguita da una corrispondenza per il secondo, ecc. Un pezzo è formato da un atomo, eventualmente seguito da un singolo(!) `*', `+', `?' o limite. Un atomo seguito da `*' corrisponde ad una successione di 0 o più corrispondenze dell'atomo. Un atomo seguito da `+' corrisponde ad una successione di 1 o più corrispondenze dell'atomo. Un atomo seguito da `?' corrisponde ad una successione di 0 o 1 corrispondenza dell'atomo. Un limite [NdT: il termine è non-standard, Regular Expressions di Jeffrey E F Friedl, O'Reilly, 1997, usa intervallo] è formato da `{' seguito da un intero decimale senza segno, eventualmente seguito da `,' eventualmente seguito da un altro intero decimale senza segno, obbligatoriamente seguito da `}'. Gli interi devono essere compresi fra 0 e RE_DUP_MAX (255(!)) inclusi, e se ce ne sono due, il primo non deve essere maggiore del secondo. Un atomo seguito da un limite contenente un intero i e nessuna virgola corrisponde ad una successione di esattamente i corrispondenze dell'atomo. Un atomo seguito da un limite contenente un intero i e una virgola corrisponde ad una successione di i o più corrispondenze dell'atomo. Un atomo seguito da un limite contenente due interi i e j corrisponde ad una successione di i fino a j (inclusi) corrispondenze dell'atomo. Un atomo è formato da un'espressione regolare racchiusa fra `()' (corrispondente ad una corrispondenza per l'espressione regolare), un insieme vuoto di `()' (corrispondente alla stringa nulla)†, un' espressione parentetica (vedi sotto), `.' (corrispondente ad un qualsiasi carattere singolo), `^' (corrispondente alla stringa nulla a inizio riga), `$' (corrispondente alla stringa nulla a fine riga), una `\' seguita da uno dei caratteri `^.[$()|*+?{\' (corrispondente a quel carattere interpretato come un carattere normale), una `\' seguita da un qualsiasi altro carattere(!) (corrispondente a quel carattere interpretato come un carattere normale, come se la `\' non fosse presente(!)), oppure un singolo carattere privo di ulteriori significati (interpretato come se stesso). Una `{' seguita da un carattere che non sia una cifra è un carattere normale, non l'inizio di un limite(!). È vietato terminare un'ER con `\'. Un' espressione parentetica è un elenco di caratteri racchiusi da `[]'. Corrisponde di norma ad un qualsiasi singolo carattere fra quelli della lista (ma vedi oltre). Se l'elenco inizia con `^', l'espressione corrisponde ad un qualsiasi singolo carattere non fra quelli della lista (ma vedi oltre). Due caratteri nell'elenco separati da un `-' formano un'abbreviazione per l'intera serie di caratteri compresi nella sequenza di collazione fra i due caratteri (inclusi). Per esempio, `[0-9]' corrisponde, in ASCII, ad una qualsiasi cifra decimale. Due serie non possono(!) condividere un estremo, per esempio `a-c-e'. Le serie dipendono particolarmente dalla sequenza di collazione, e un programma, per essere portabile, non dovrebbe dipenderne. Se si vuole includere una `]' nell'elenco, bisogna metterla al primo posto (dopo un eventuale `^'). Se si vuole includere un `-' nell'elenco, bisogna metterlo al primo o all'ultimo posto, o come estremo destro di una serie. Se si vuole usare un `-' come estremo sinistro di una serie, bisogna trasformarlo in un elemento di collazione racchiudendolo fra `[.' e `.]' (vedi sotto). Eccetto queste combinazioni, e alcune altre con `[' (vedi il prossimo paragrafo), tutti gli altri caratteri speciali, inclusa la `\', perdono il loro significato speciale quando all'interno di un'espressione parentetica. All'interno di un'espressione parentetica, un elemento di collazione (un carattere o una sequenza di più caratteri che viene ordinata come se fosse un carattere singolo o una sequenza di collazione che sta per uno dei due) racchiuso fra `[.' e `.]' rappresenta la sequenza di caratteri dell'elemento di collazione. La sequenza è un unico argomento dell'elenco nell'espressione parentetica. Pertanto, un'espressione che contiene un elemento di collazione a più caratteri può corrispondere a più di un carattere. Per esempio, se la sequenza di collazione include l'elemento di collazione `ch', allora l'ER `[[.ch.]]*c' corrisponde ai primi cinque caratteri di `chchcc'. All'interno di un'espressione parentetica, un elemento di collazione racchiuso fra `[=' e `=]' è una classe di equivalenza, cioè la sequenza di caratteri di tutti gli elementi di collazione equivalenti, lui incluso (se non ci sono altri elementi di collazione equivalenti, il risultato è lo stesso che ci sarebbe se i segni di delimitazione fossero `[.' e `.]'). Per esempio, se o e ^ appartengono ad una classe di equivalenza, allora `[[=o=]]', `[[=^=]]' e `[o^]' sono tutti sinonimi. Una classe di equivalenza non può essere un estremo di una serie. All'interno di un'espressione parentetica, il nome di una classe di caratteri racchiusa fra `[:' e `:]' rappresenta l'elenco di tutti i caratteri di quella classe. I nomi delle classi standard di caratteri sono:alnum digit punct alpha graph space blank lower upper cntrl print xdigit
BACHI¶
Avere due tipi di ER è un pasticcio. Le specifiche attuali in POSIX.2 dicono che `)' è un carattere normale in mancanza di un corrispondente `(': questo è un risultato non voluto di una scelta sbagliata di vocaboli, e sarebbe meglio cambiarlo. Non fare affidamento su questo. Le referenze all'indietro sono un casino incredibile, e rendono molto difficile un'implementazione efficiente. La loro definizione è pure ambigua: `a\(\(b\)*\2\)*d' corrisponde a `abbbd' o no? È meglio non usarle. Le specifiche in POSIX.2 sulle corrispondenze indipendenti da maiuscole/minuscole sono approssimative. La definizione data sopra di «un caso implica tutti i casi» è quella al momento considerata corretta dagli implementatori.VEDERE ANCHE¶
grep(1), regex(3) POSIX.2, sezione 2.8 (Notazione per le espressioni regolari).COLOPHON¶
Questa pagina fa parte del rilascio 2.79 del progetto man-pages di Linux. Si può trovare una descrizione del progetto, e informazioni su come riportare bachi, presso http://www.kernel.org/doc/man-pages/. Per la traduzione in italiano si può fare riferimento a http://www.pluto.it/ildp/collaborare/12 dicembre 2007 | Linux Programmer's Manual |