index | project | pods | responsabili |
NOMEperlrequick - Guida rapida alle espressioni regolari del Perl
DESCRIZIONEQuesta pagina descrive gli elementi di base per quanto riguarda la comprensione, la creazione e l'uso delle espressioni regolari (regex) in Perl.
La Guida
Il semplice match di una parolaLa regex più semplice è semplicemente una parola, o più in generale, una stringa di caratteri. Una regex che consiste in una parola, matcha ogni stringa che contiente quella parola: "Ciao Mondo" =~ /Mondo/; # matcha In questa asserzione (statement), Le espressioni come questa sono molto utili nei condizionali: print "Questo matcha\n" if "Ciao Mondo" =~ /Mondo/; Il senso del match può essere invertito usando l'operatore print "Questo non matcha\n" if "Ciao Mondo" !~ /Mondo/; La stringa letterale nella regex può essere sostituita da una variabile: $saluti = "Mondo"; print "Questo matcha\n" if "Ciao Mondo" =~ /$saluti/; Se stai facendo matching attraverso $_ = "Ciao Mondo"; print "Questo matcha\n" if /Mondo/; Infine, i "Ciao Mondo" =~ m!Mondo!; # matcha, delimitato da '!' "Ciao Mondo" =~ m{Mondo}; # matcha, da notare the matching '{}' "/usr/bin/perl" =~ m"/perl"; # matcha dopo '/usr/bin', # '/' diventa un carattere qualsiasi Le regex devono effettuare un match della parte di una stringa esattamente affinché l'asserzione (statement) sia vera: "Ciao Mondo" =~ /mondo/; # non matcha, case sensitive "Ciao Mondo" =~ /o M/; # matcha, ' ' e` un carattere qualsiasi "Ciao Mondo" =~ /Mondo /; # non matcha, non c'e` un ' ' alla fine perl effettuerà sempre un match nel punto della stringa più vicino: "Ciao Mondo" =~ /o/; # matcha 'o' in 'Ciao' "That hat is red" =~ /hat/; # matcha 'hat' in 'That' [Questo cappello e` rosso, NdT] Non tutti i caratteri possono essere usati 'letteralmente' in un match. Alcuni caratteri chiamati metacaratteri, sono riservati per utilizzarli nella notazione delle regex. I metacaratteri sono {}[]()^$.|*+?\ Un metacarattere può essere matchato inserendo un backslash prima di lui: "2+2=4" =~ /2+2/; # non matcha, + e` un metacarattere "2+2=4" =~ /2\+2/; # matcha, \+ e` trattato come un semplice + 'C:\WIN32' =~ /C:\\WIN/; # matcha "/usr/bin/perl" =~ /\/usr\/local\/bin\/perl/; # matcha Nell'ultima regex, le successive slash I caratteri ASCII non stampabili sono rappresentati da sequenze di escape.
Esempi comuni sono "1000\t2000" =~ m(0\t2) # matcha "cat" =~ /\143\x61\x74/ # matcha, ma e` un modo bizzarro per pronunciare gatto Le regex sono trattate principalmente come stringhe tra doppi apici, quindi funziona la sostituzione di variabile: $pippo = 'cassa'; 'grancassa' =~ /gran$pippo/; # matcha 'cassagran' =~ /${pippo}gran/; # matcha In tutte le regex viste sopra, se la regex matcha ovunque nella stringa,
viene considerato un match. Per speficicare dove dovrà effettuare il match,
useremo i metacaratteri ancora "donna di casa" =~ /casa/; # matcha "donna di casa" =~ /^casa/; # non matcha "donna di casa" =~ /casa$/; # matcha "donna di casa\n" =~ /casa$/; # matcha "donna di casa" =~ /^donna di casa$/; # matcha
L'utilizzo di classi di caratteriUna classe di caratteri permette ad un insieme di possibili caratteri, piuttosto
che un solo singolo carattere, di essere matchati ad un punto particolare in una regex.
Le classi di caratteri sono denotate da parentesi quadre /gatto/; # matcha 'gatto' /[pgr]atto/; # matcha 'patto', 'gatto', or 'ratto' "abc" =~ /[cab]/; # matcha 'a' Nell'ultima asserzione (statement), anche se /[yY][eE][sS]/; # matcha 'yes' in modalita` case-insensitive # 'yes', 'Yes', 'YES', ecc. /yes/i; # anche questo matcha 'yes' in modalita` case-insensitive way [sì, NdT] L'ultimo esempio mostra una match con un modificatore Le classi di caratteri possiedono sia caratteri normali (ordinary) che speciali,
ma gli insiemi di caratteri normali e speciali all'interno di una classe di
caratteri sono differenti rispetto a quelli al di fuori di una classe di
caratteri. I caratteri speciali per una classe di caratteri sono /[\]c]def/; # matcha ']def' or 'cdef' $x = 'bcr'; /[$x]at/; # matcha 'bat, 'cat', or 'rat' [pipistrello, gatto, ratto, NdT] /[\$x]at/; # matcha '$at' or 'xat' /[\\$x]at/; # matcha '\at', 'bat, 'cat', or 'rat' Il carattere speciale /item[0-9]/; # matcha 'item0' o ... o 'item9' /[0-9a-fA-F]/; # matcha un numero esadecimale Se Il carattere speciale /[^a]at/; # non matcha 'aat' or 'at', ma matcha # tutti gli altri 'bat', 'cat, '0at', '%at', etc. /[^0-9]/; # matcha un carattere non numerico /[a^]at/; # matcha 'aat' o '^at'; qui '^' e` normale Il Perl ha diverse abbreviazioni per le classi di caratteri comuni:
Le abbreviazioni /\d\d:\d\d:\d\d/; # matcha un formato tempo hh:mm:ss /[\d\s]/; # matcha ogni numero o spazio /\w\W\w/; # matcha un carattere normale, seguito # da un carattere di formattazione, seguito da un carattere normale /..rt/; # matcha due caratteri qualunque, seguiti da 'rt' /end\./; # matcha 'end.' [fine, NdT] /end[.]/; # stessa cosa, matcha 'end.' L'ancora di parola $x = "Housecat catenates house and cat"; [Casagatto concatena casa e gatto, NdT] $x =~ /\bcat/; # matcha cat in 'catenates' $x =~ /cat\b/; # matcha cat in 'housecat' $x =~ /\bcat\b/; # matcha 'cat' alla fine della stringa Nell'ultimo esempio la fine della stringa viene considerata un confine di parola.
Matchare questo o quelloPossiamo effettuare il match di differenti stringhe di caratteri con il
metacarattere "cats and dogs" =~ /cat|dog|bird/; # matcha "cat" [cani e gatti, cane|gatto|uccello, NdT] "cats and dogs" =~ /dog|cat|bird/; # matcha "cat" Anche se "cats" =~ /c|ca|cat|cats/; # matcha "c" "cats" =~ /cats|cat|ca|c/; # matcha "cats" Ad una data posizione di un carattere, la prima alternativa che permette al match della regex di avere successo sarà quella che effettuerà il match. Qui, tutte le alternative matchano alla prima posizione della stringa, così la prima di esse matcha per prima.
Raggruppamenti di cose e match gerarchicoI metacaratteri di raggruppamento /(a|b)b/; # matcha 'ab' o 'bb' /(^a|b)c/; # matcha 'ac' all'inizio della stringa o 'bc' ovunque /house(cat|)/; # matcha sia 'housecat' che 'house' /house(cat(s|)|)/; # matcha sia 'housecats' sia 'housecat' sia # 'house'. Va notato che i raggruppamenti possono essere annidati. "20" =~ /(19|20|)\d\d/; # matcha l'alternativa nulla '()\d\d', # perche' '20\d\d' non puo` matchare
L'estrazione di matchI metacaratteri di raggruppamento # estrae ore, minuti, secondi $tempo =~ /(\d\d):(\d\d):(\d\d)/; # matcha il formato hh:mm:ss $ore = $1; $minuti = $2; $secondi = $3; In un contesto di lista, un match ($ore, $minuti, $secondi) = ($tempo =~ /(\d\d):(\d\d):(\d\d)/); Se i raggruppamenti in una regex sono nidificati, /(ab(cd|ef)((gi)|j))/; 1 2 34 Associati con le variabili di match /(\w\w\w)\s\1/; # trova le sequenze tipo 'uno uno' nella stringa
Ripetizioni di matchI metacaratteri quantificatori
Qui ci sono alcuni esempi: /[a-z]+\s+\d*/; # matcha una parola formata da lettere minuscole, almeno uno spazio, e # un numero qualsiasi di cifre /(\w+)\s+\1/; # matcha parole doppie separate da uno o piu` spazi di lunghezza # arbitraria $year =~ /\d{2,4}/; # si assicura che l'anno sia almeno di 2 cifre ma non piu` # di 4 cifre $year =~ /\d{4}|\d{2}/; # un match migliore; scarta date con 3 cifre Questi quantificatori cercano di matchare più stringa possibile, mentre si sta ancora permettendo alla regex di mathcare. Dunque abbiamo $x = 'the cat in the hat'; [il gatto nel cappello, NdT] $x =~ /^(.*)(at)(.*)$/; # matcha, # $1 = 'the cat in the h' # $2 = 'at' # $3 = '' (0 match) Il primo quantificatore
Ulteriore matchingCi sono ancora alcune cose che si devono conoscere sugli operatori di matching. Nel codice $pattern = 'Seuss'; while (<>) { print if /$pattern/; } perl deve ri-valutare ogni volta $pattern = 'Seuss'; m'$pattern'; # effettua un match di '$pattern', non di 'Seuss' Il modificatore globale $x = "cat dog house"; # 3 words while ($x =~ /(\w+)/g) { print "La parola $1, finisce alla posizione ", pos $x, "\n"; } stampa La parola cat, finisce alla posizione 3 La parola dog, finisce alla posizione 7 La parola house, finisce alla posizione 13 Un match fallito o il cambiamento della stringa obiettivo, resetta la posizione.
Se non si vuole che la posizione venga resettata dopo il fallimento del match, si
aggiunga la In un contesto di lista, @words = ($x =~ /(\w+)/g); # matcha, # $word[0] = 'cat' # $word[1] = 'dog' # $word[2] = 'house'
Ricerca e sostituzioneLa ricerca e la sostituzione sono effettuate usando $x = "Time to feed the cat!"; [E` ora di dar da mangiare al gatto, NdT] $x =~ s/cat/hacker/; # $x contiene "Time to feed the hacker!" $y = "'quoted words'"; [parole tra doppie virgolette, NdT] $y =~ s/^'(.*)'$/$1/; # elimina gli apici singoli, # $y contiene "quoted words" Con l'operatore $x = "I batted 4 for 4"; [Ho fatto 4 battute su 4, NdT] $x =~ s/4/four/; # $x contiene "I batted four for 4" $x = "I batted 4 for 4"; $x =~ s/4/four/g; # $x contiene "I batted four for four" Il modificatore di valutazione # inverte tutte le lettere in una stringa $x = "the cat in the hat"; $x =~ s/(\w+)/reverse $1/ge; # $x contains "eht tac ni eht tah" # converte una percentuale in decimale $x = "A 39% hit rate"; [Una percentuale di battuta del 39%, NdT] $x =~ s!(\d+)%!$1/100!e; # $x contains "A 0.39 hit rate" L'ultimo esempio mostra che
L'operatore split
$x = "Calvin and Hobbes"; @word = split /\s+/, $x; # $word[0] = 'Calvin' # $word[1] = 'and' [e, NdT] # $word[2] = 'Hobbes' Per estrarre una lista di numeri separati da virgola, si usi $x = "1.618,2.718, 3.142"; @const = split /,\s*/, $x; # $const[0] = '1.618' # $const[1] = '2.718' # $const[2] = '3.142' Se viene usata la regex vuota $x = "/usr/bin"; @parts = split m!(/)!, $x; # $parts[0] = '' # $parts[1] = '/' # $parts[2] = 'usr' # $parts[3] = '/' # $parts[4] = 'bin' Dato che il primo carattere di $x matcha la regex,
BUGNessuno.
SI VEDA ANCHEQuesta è solo una guida rapida. Per un corso più approfondito sulle regex, guardate perlretut e per la pagina di reference, guardate perlre.
AUTORE E COPYRIGHTCopyright (c) 2000 Mark Kvale Tutti i diritti riservati. Questo documento può essere distribuito secondo gli stessi termini del Perl.
RiconoscimentiL'autore vuole ringraziare Mark-Jason Dominus, Tom Christiansen, Ilya Zakharevich, Brad Hughes e Mike Giroux per tutti i loro utili commenti.
TRADUZIONE
VersioneLa versione su cui si basa questa traduzione è ottenibile con: perl -MPOD2::IT -e print_pod perlrequick Per maggiori informazioni sul progetto di traduzione in italiano si veda http://pod2it.sourceforge.net/ .
TraduttoreTraduzione a cura di dree.
RevisoreRevisione a cura di Marco Allegretti. Mon Jun 11 22:02:18 2012 |