Pattern (Java Platform SE 7) (Italiano)

Una rappresentazione compilata di unespressione regolare.

Unespressione regolare, specificata come stringa, deve prima essere compilata in unistanza di questa classe. Il pattern risultante può quindi essere utilizzato per creare un Matcher oggetto che può corrispondere a sequenze di caratteri contro lespressione regolare. Tutto lo stato coinvolto nellesecuzione di una partita risiede nel matcher, quindi molti matcher possono condividere lo stesso schema.

Una tipica sequenza di invocazione è quindi

 Pattern p = Pattern.
("a*b"); Matcher m = p.
("aaaaab"); boolean b = m.
();

Un metodo matches è definito da questa classe per comodità quando unespressione regolare viene utilizzata solo una volta. Questo metodo compila unespressione e confronta una sequenza di input con essa in una singola chiamata. La dichiarazione

 boolean b = Pattern.matches("a*b", "aaaaab");

è equivalente alle tre dichiarazioni precedenti, anche se per le corrispondenze ripetute è meno efficiente poiché non consente il riutilizzo del pattern compilato.

Le istanze di questa classe sono immutabili e possono essere utilizzate da più thread simultanei. Le istanze della classe Matcher non sono sicure per tale utilizzo.

Riepilogo dei costrutti di espressioni regolari

Backslash, escape e citazioni

Il carattere backslash (“\”) serve per introdurre i costrutti con escape, come definito in la tabella sopra, oltre a citare caratteri che altrimenti verrebbero interpretati come costrutti senza caratteri di escape. Quindi lespressione \\ corrisponde a una singola barra rovesciata e \ {corrisponde a una parentesi graffa sinistra.

È un errore utilizzare una barra rovesciata prima di qualsiasi carattere alfabetico che non denoti un costrutto con escape; questi sono riservati per future estensioni al linguaggio delle espressioni regolari. È possibile utilizzare una barra rovesciata prima di un carattere non alfabetico indipendentemente dal fatto che quel carattere faccia parte di un costrutto senza caratteri di escape.

I backslash allinterno di stringhe letterali nel codice sorgente Java vengono interpretati come richiesto dalla specifica del linguaggio Java ™ come caratteri di escape Unicode (sezione 3.3) o altri caratteri di escape (sezione 3.10.6) È quindi necessario raddoppiare i backslash in stringhe letterali che rappresentano espressioni regolari per proteggerle dallinterpretazione da parte del compilatore di bytecode Java. La stringa letterale “\ b”, ad esempio, corrisponde a un singolo carattere backspace quando interpretata come unespressione regolare, mentre “\\ b” corrisponde a un confine di parola. La stringa letterale “\ (ciao \)” è illegale e porta a un errore in fase di compilazione; per far corrispondere la stringa (ciao) è necessario utilizzare la stringa letterale “\\ (ciao \\)”.

Classi di caratteri

Le classi di caratteri possono apparire allinterno di altre classi di caratteri e possono essere composte dalloperatore di unione (implicito) e dalloperatore di intersezione (& &). Loperatore di unione indica una classe che contiene ogni carattere che si trova in almeno una delle sue classi di operandi. Loperatore di intersezione denota una classe che contiene tutti i caratteri presenti in entrambe le classi di operandi.

La precedenza degli operatori delle classi di caratteri è la seguente, dalla più alta alla più bassa:

1 Escape letterale \ x
2 Raggruppamento
3 Intervallo az
4 Unione
5 Intersezione ]

Nota che un diverso insieme di metacaratteri è in effetto allinterno di una classe di caratteri rispetto allesterno di una classe di caratteri. Ad esempio, lespressione regolare. perde il suo significato speciale allinterno di una classe di caratteri, mentre lespressione – diventa un metacarattere che forma un intervallo.

Terminatori di riga

Un terminatore di riga è una sequenza di uno o due caratteri che segna la fine di una riga della sequenza di caratteri di input. I seguenti sono riconosciuti come terminatori di riga:

Se la modalità UNIX_LINES è attivata, gli unici terminatori di riga riconosciuti sono i caratteri di nuova riga.

Lespressione regolare. corrisponde a qualsiasi carattere tranne un terminatore di riga a meno che non sia specificato il flag DOTALL.

Per impostazione predefinita, le espressioni regolari ^ e $ ignorano i terminatori di riga e corrispondono solo allinizio e alla fine, rispettivamente, dellintera sequenza di input. Se la modalità MULTILINE è attivata, ^ corrisponde allinizio dellinput e dopo ogni terminatore di riga tranne alla fine dellinput. Quando in modalità MULTILINE $ corrisponde appena prima di un terminatore di riga o alla fine della sequenza di input.

Gruppi e cattura

Numero di gruppo

I gruppi di cattura vengono numerati contando le loro parentesi di apertura da sinistra a destra.Nellespressione ((A) (B (C))), ad esempio, ci sono quattro di questi gruppi:

1

((A) (B (C)))

2

(A)

3

(B (C))

4

(C)

Il gruppo zero rappresenta sempre lintera espressione.

I gruppi di cattura sono così chiamati perché, durante una corrispondenza, ogni sottosequenza della sequenza di input che corrisponde a tale gruppo viene salvata. La sottosequenza catturata può essere utilizzata successivamente nellespressione, tramite un riferimento a ritroso, e può anche essere recuperata dal matcher una volta completata loperazione di abbinamento.

Nome del gruppo

A un gruppo di cattura può anche essere assegnato un “nome”, un gruppo di cattura con nome, e quindi si può fare nuovamente riferimento al “nome” in seguito. I nomi dei gruppi sono composti dai seguenti caratteri. Il primo carattere deve essere una lettera.

Un gruppo di acquisizione con nome è ancora numerato come descritto in Numero gruppo.

Linput catturato associato a un gruppo è sempre la sottosequenza che il gruppo ha trovato più recentemente. Se un gruppo viene valutato una seconda volta a causa della quantificazione, il suo valore acquisito in precedenza, se presente, verrà mantenuto se la seconda valutazione fallisce. La corrispondenza della stringa “aba” con lespressione (a (b)?) +, Ad esempio, lascia il gruppo due impostato su “b”. Tutti gli input catturati vengono scartati allinizio di ogni partita.

I gruppi che iniziano con (? sono o gruppi puri e non di acquisizione che non acquisiscono testo e non contano per il totale del gruppo, o gruppi di acquisizione con nome.

Supporto Unicode

Questa classe è conforme al livello 1 dello standard tecnico Unicode n. 18: Unicode Regular Expression, più RL2.1 Canonical Equivalents.

Sequenze di escape Unicode come \ u2014 nel codice sorgente Java vengono elaborati come descritto nella sezione 3.3 delle specifiche del linguaggio Java ™. Tali sequenze di escape sono anche implementate direttamente dal parser di espressioni regolari in modo che gli escape Unicode possano essere utilizzati nelle espressioni che vengono lette dai file o dalla tastiera. Pertanto le stringhe ” \ u2014 “e” \\ u2014 “, sebbene non uguali, vengono compilati nello stesso modello, che corrisponde al carattere con valore esadecimale 0x2014.

Un carattere Unicode può anche essere rappresentato in unespressione regolare utilizzando la sua notazione esadecimale (valore del punto di codice esadecimale) direttamente come descritto nel costrutto \ x {…}, per esempio, un carattere supplementare U + 2011F può essere specificato come \ x {2011F}, invece di due sequenze di escape Unicode consecutive della coppia surrogata \ uD840 \ uDD1F.

Gli script, i blocchi, le categorie e le proprietà binarie Unicode sono scritti con i costrutti \ pe \ P come in Perl. \ p {prop} corrisponde se linput ha la proprietà prop, mentre \ P {prop} non corrisponde se linput ha quella proprietà.

Script, blocchi, categorie e proprietà binarie possono essere utilizzati sia allinterno che allesterno di una classe di caratteri.

Gli script vengono specificati con il prefisso Is, come in IsHiragana, o utilizzando script parola chiave (o la sua forma abbreviata sc) come in script=Hiragana o sc=Hiragana.

I nomi di script supportati da Pattern sono i nomi di script validi accettati e definiti da UnicodeScript.forName.

I blocchi vengono specificati con il prefisso In, come InMongolian o utilizzando la parola chiave block (o la sua forma abbreviata blk) come block=Mongolian o blk=Mongolian.

I nomi di blocco supportati da Pattern sono i nomi di blocco validi accettati e definiti da UnicodeBlock.forName.

Le categorie possono essere specificate con il prefisso facoltativo Is: sia \p{L} che \p{IsL} denota la categoria delle lettere Unicode. Come gli script e i blocchi, le categorie possono anche essere specificate utilizzando la parola chiave general_category (o la sua forma abbreviata gc) come in general_category=Lu o gc=Lu.

Le categorie supportate sono quelle dello standard Unicode nella versione specificata dalla classe Character. I nomi delle categorie sono quelli definiti nello Standard, sia normativi che informativi.

Le proprietà binarie sono specificate con il prefisso Is, come in IsAlphabetic.Le proprietà binarie supportate da Pattern sono

  • Alfabetico
  • Ideografico
  • Lettera
  • Minuscolo
  • Maiuscolo
  • Titolo
  • Punteggiatura
  • Controllo
  • Spazio_bianco
  • Digit
  • Hex_Digit
  • Noncharacter_Code_Point
  • Assegnato

Le classi di caratteri predefinite e le classi di caratteri POSIX sono conformi alla raccomandazione di Allegato C: proprietà di compatibilità dellespressione regolare Unicode, quando è specificato il flag UNICODE_CHARACTER_CLASS.

Le categorie che si comportano come i metodi java.lang.Character booleano ismethodname (eccetto quelli deprecati) sono disponibili tramite la stessa sintassi \ p {prop} in cui la proprietà specificata ha il nome javamethodname.

Confronto con Perl 5

Il motore Pattern esegue la corrispondenza tradizionale basata su NFA con alternanza ordinata come avviene in Perl 5.

Costrutti Perl non supportati da questa classe:

Costrutti supportati da questa classe ma non da Perl:

  • Unione di classi di caratteri e intersezione come descritto sopra.

Differenze notevoli da Perl:

  • In Perl, da \ 1 a \ 9 sono sempre interpretati come riferimenti a ritroso; un numero di escape con barra rovesciata maggiore di 9 viene trattato come un riferimento a ritroso se esistono almeno tante sottoespressioni, altrimenti viene interpretato, se possibile, come un escape ottale. In questa classe gli escape ottali devono sempre iniziare con uno zero. In questa classe, da \ 1 a \ 9 vengono sempre interpretati come riferimenti a ritroso e un numero maggiore è accettato come riferimento a ritroso se almeno tante sottoespressioni esistono in quel punto dellespressione regolare, altrimenti il parser lascerà le cifre fino al numero è minore o uguale al numero di gruppi esistente oppure è una cifra.

  • Perl usa il flag g per richiedere una corrispondenza che riprenda dal punto in cui si era interrotta lultima corrispondenza. Questa funzionalità è fornita implicitamente dalla classe Matcher: invocazioni ripetute del metodo find riprenderanno dal punto in cui si era interrotta lultima corrispondenza, a meno che il matcher viene ripristinato.

  • In Perl, i flag incorporati al livello superiore di unespressione influenzano lintera espressione. In questa classe, i flag incorporati hanno sempre effetto nel punto in cui compaiono, sia che si trovino al livello più alto o allinterno di un gruppo; in questultimo caso, i flag vengono ripristinati alla fine del gruppo proprio come in Perl.

Per una descrizione più precisa del comportamento dei costrutti di espressioni regolari, vedere Mastering Regular Expressions, 3nd Edition, Jeffrey EF Friedl, O “Reilly and Associates, 2006.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *