You are on page 1of 11

VBJ — n.

74 — marzo-aprile 2007
Regular Expression parte 1
di Vito Vessia
Le Regular Expression risolvono, una volta per tutte, l’annoso proble-
ma dell’implementazione di parser di stringhe pi ` u o meno sofisticati.
Vito Vessia
`
E cofondatore del-
la codeBehind S.r.l.
(http://www.codeBehind.it),
una software factory di
applicazioni enterprise,
web e mobile, dove
progetta e sviluppa ap-
plicazioni e framework
in .NET, COM(+) e Del-
phi occupandosi degli
aspetti architettura-
li.
`
E autore del libro
“Programmare il cellu-
lare”, Hoepli, 2002, sulla
programmazione dei
telefoni cellulari connes-
si al PC con protocol-
lo standard AT+
pubblicato su
WWW.INFOMEDIA.IT

stampa digitale da
Lulu Enterprises Inc.
stores.lulu.com/infomedia
Infomedia
Infomedia ` e l’impresa editoriale che da quasi venti an-
ni ha raccolto la voce dei programmatori, dei sistemi-
sti, dei professionisti, degli studenti, dei ricercatori e dei
professori d’informatica italiani.
Sono pi ` u di 800 gli autori che hanno realizzato per le te-
state Computer Programming, Dev, Login, Visual Basic
Journal e Java Journal, molte migliaia di articoli tecnici,
presentazioni di prodotti, tecnologie, protocolli, strumen-
ti di lavoro, tecniche di sviluppo e semplici trucchi e stra-
tagemmi. Oltre 6 milioni di copie distribuite, trentamila
pagine stampate, fanno di questa impresa la pi` u grande ed
influente realt` a dell’editoria specializzata nel campo della
programmazione e della sistemistica.
In tutti questi anni le riviste Infomedia hanno vissuto del-
la passione di quanti vedono nella programmazione non
solo la propria professione ma un’attivit` a vitale e un vero
divertimento.
Nel 2009, Infomedia ` e cambiata radicalmente adottando
un nuovo modello aziendale ed editoriale e si ` e organiz-
zata attorno ad una idea di Impresa Sociale di Comunit` a,
partecipata da programmatori e sistemisti, separando le
attivit` a di gestione dell’informazione gestite da un board
comunitario professionale e quelle di produzione gesti-
te da una impresa strumentale. Questo assetto ` e in linea
con le migliori esperienze internazionali e rende Infome-
dia ancora di pi ` u parte della Comunit` a nazionale degli
sviluppatori di software.
Infomedia ` e media-partner di manifestazioni ed eventi in
ambito informatico, collabora con molti dei pi` u impor-
tanti editori informatici italiani come partner editoriale e
fornitore di servizi di localizzazione in italiano di testi in
lingua inglese.
L’impaginazione automatica di questa rivista ` e realizzata al
100% con strumenti Open Source usando OpenOffice,
Emacs, BHL, LaTeX, Gimp, Inkscape e i linguaggi Lisp,
Python e BASH
For copyright information about the contents of Visual
Basic Journal, please see the section “Copyright” at the
end of each article if exists, otherwise ask authors. In-
fomedia contents is © 2007 Infomedia and released as
Creative Commons 2.5 BY-NC-ND. Turing Club content
is © 2007 Turing Club released as Creative Commons
2.5 BY-ND.
Le informazioni di copyright sul contenuto di Visual Ba-
sic Journal sono riportate nella sezione “Copyright” al-
la fine di ciascun articolo o vanno richieste direttamente
agli autori. Il contenuto Infomedia ` e © 2007 Infomedia
e rilasciato con Licenza Creative Commons 2.5 BY-NC-
ND. Il contenuto Turing Club ` e © 2007 Turing Club e
rilasciato con Licenza Creative Commons 2.5 BY-ND. Si
applicano tutte le norme di tutela dei marchi e dei segni
distintivi.
`
E in ogni caso ammessa la riproduzione parziale o tota-
le dei testi e delle immagini per scopo didattico purch´ e
vengano integralmente citati gli autori e la completa
identificazione della testata.
Manoscritti e foto originali, anche se non pubblicati, non
si restituiscono.
Contenuto pubblicitario inferiore al 45%.
La biografia dell’autore riportata nell’articolo e sul
sito www.infomedia.it ` e di norma quella disponibi-
le nella stampa dell’articolo o aggiornata a cu-
ra dell’autore stesso. Per aggiornarla scrivere a
info@infomedia.it o farlo in autonomia all’indirizzo
http://mags.programmers.net/moduli/biografia
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
IeguIar £xpressIon
IrIma Iarle
GL9LWR9HVVLD
Nonoslanle ognI appIIcazIone dI un cerlo IIveIIo
presenlI sempre sIngoIarIlà che Ia rendono unIca,
cI sono spesso pezzI dI codIce che Ianno pressoché
Ie slesse cose. IrIma deII`InlroduzIone dI ambIenlI
dI svIIuppo IÀI (IapId ÀppIIcalIon IeveIopmenl),
Ia parle pIu onerosa In lermInI dI energIe e lempo
speso era Ialla daIIa GII per ¨dIsegnare¨ I`InlerIac-
cIa ulenle. Io slesso accade ancor oggI per Ie appII-
cazIonI web, InsIeme aI lempo necessarIo per scrI-
vere codIce dI geslIone deI dalI, ormaI IndIspensa-
bIIe In quaIsIasI appIIcazIone non banaIe.
Ina quola rIIevanle dI lempo è InoIlre speso per
queIIo che sarà I`argomenlo dI queslo arlIcoIo: I`ana-
IIsI e Ia decodIIIca deIIe slrInghe dI leslo. Ia scrIl-
lura dI parser ha InIallI sempre sollrallo moIlIssI-
me energIe, soprallullo neI passalo, quando Ie ap-
pIIcazIonI II£MS orIenled non erano una norma
e non esIsleva I`XMI (che, pur essendo anch`esso
leslo puro, è geslIlo da polenlI parser specIaIIzza-
lI, dellI IOM).
,OSUREOHPD
QueIIo deIIa geslIone deIIe
slrInghe è un probIema ¨unI-
versaIe¨: che sIale In WIndows
o In InIx, che I`appIIcazIone
sIa bInarIa oppure web, cI sa-
ranno sempre deIIe slrInghe da
conlroIIare. QueIIo che normaI-
menle accade è che, dopo aver
scrIllo II noslro parser (In pralIca
un pugno dI IunzIonI super-spe-
cIaIIzzale ed In grado dI opera-
re soIo suIIe slrInghe specIIIche
deI programma correnle), occor-
rono modIIIche o rIscrIllure non
appena queslo Iormalo cambIa;
deI reslo è umanamenle Impen-
sabIIe decIdere dI scrIvere Iun-
zIonI deI lullo generIche.
IrocedIamo con un esempIo; sI
supponga dI voIer eslrarre aIcu-
ne InIormazIonI daIIa seguenle
slrInga dI medIa compIessIlà,
IdenlIIIcabIIe come un IIIe dI
ImporlazIone, provenIenle da
un IornIlore, conlenenle dalI
9LWR 9HVVLD µ|oçe||a e sv//oµµa aµµ//caz/on/ e /|amewo|k
occoµandos/ deç// asµe||/ a|ch/|e||o|a// $c|/ve da ann/ µe| /e
µ|/nc/µa// |/v/s|e /|a//ane d/ µ|oç|ammaz/one ed e ao|o|e de/
//b|o ¨P|oç|amma|e // ce//o/a|e¨ Hoeµ// 2002 so/ µ|o|oco//o
s|anda|d A7+ de/ |e/e/on/ ce//o/a|/ con Poo esse|e con|a||a|o
||am/|e e-ma// a//´/nd/|/zzo vvess/a@ka|ama//com
Le Begu|or L+pressicu risc|ccuc, uuo cc|to per tutte, |´ouucsc prcb|emo
de||´imp|emeuto:icue di porser di striugne piu c meuc scjisticoti.
Bipubb|icniomc questc orticc|c, crigiuoriomeute uscitc su Ccmputer
Prcgrommiug u.1?7, per |´uti|ito de||o trotto:icue cne preseuto.
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
secondo e 2 neI lerzo). InoIlre bIsogna consI-
derare che cIascuna deIIe due rIghe che coslI-
luIscono I`InIormazIone dI un prodollo deve
avere come prImo campo II codIce deI prodol-
lo, che quIndI deve essere uguaIe neIIe due
rIghe. Ma spella veramenle a noI sobbarcarcI
I`onere dI scrIvere queslo parser?
/DVROX]LRQHDOSUREOHPD
£sIsle un aIlro modo per eIIelluare I`anaII-
sI deIIe slrInghe, decIsamenle pIu polenle e
meno gravoso per Io svIIuppalore, che va sol-
lo II nome dI £spressIonI IegoIarI (IeguIar
£xpressIon), per brevIlà regex. MIcrosoIl ha
Inlrodollo superbamenle II supporlo a quesla
lecnoIogIa neI IrameworR .N£J e preceden-
lemenle neI molore dI scrIplIng dI Inlernel
£xpIorer (e quIndI dI WIndows), ma sI lralla
essenzIaImenle dI lecnoIogIa slandard comu-
ne anche ad aIlrI IInguaggI.
Iegex è appunlo una nolazIone (un IInguag-
gIo) specIIIcalamenle progellala per I`anaIIsI
e I`eslrazIone deI dalI daIIe slrInghe. £ slala
Inlrodolla InIzIaImenle In IInguaggI web-unIx-
orIenled come II perI, ma poI sI è dIIIusa an-
che In aIlrI ambIenlI, senza però ollenere un
grande successo In ambIlo WIndows. In eIIel-
lI presenla una dIIIIcoIlà dI apprendImenlo
InIzIaIe rIIevanle ma, una voIla superalaIa, sI
mandano deIInIlIvamenle In pensIone Ie vec-
chIe lecnIche dI anaIIsI deIIe slrInghe.
Ie £spressIonI IegoIarI sono una IunzIona-
IIlà che permelle dI ollenere rIsuIlalI slupeIa-
dI carIco deI magazzIno:
I dalI sono presenlI su rIghe dIIIerenlI sepa-
rale da un <CIII>. CIascuna InIormazIone
rIguarda dIIIerenlI prodollI da carIcare ed è
dIsposla su due rIghe: Ia prIma, preIIssala da
un IIXN-1 (dove N è II numero dI rIga con un
paddIng a 8 cIIre) rIporla Ie InIormazIonI Ion-
damenlaII deI prodollo; Ia seconda, preIIssa-
la da un IIXn-2 (dove n è II numero dI rIga
coI soIIlo paddIng a 8 cIIre), rIporla I`eIenco
deI barcode ad essa assocIalI. Ie InIormazIo-
nI neI sIngoII campI sono separale da vIrgoIa,
non sono posIzIonaII (neI senso che I campI
non InIzIano sempre daIIo slesso numero dI
coIonna), aIcunI campI possono essere omes-
sI anche se vIene rIservala Ia Ioro posIzIone
daIIa presenza deIIa vIrgoIa (ad esempIo Ia
sequenza ¨022842,,ÀIIM¨). ÀIcunI aIlrI cam-
pI, queIII In coda, possono essere addIrIllura
omessI. I campI conlenulI neII`InIormazIone
sono I seguenlI: IdenlIIIcalIvo (es. ¨045826¨),
Gruppo MerceoIogIco (es. ¨ÀIIM¨), IamIgIIa
(es. ¨I£I£II£¨), SolloIamIgIIa (es. ¨IIIJ-
JÀ¨), IescrIzIone (es. ¨M£I£ JI£NJ.¨), InI-
là dI mIsura (es. ¨KG¨), Iala movImenlo (es.
¨2002-09-29¨) e IIno a lre CodIcI a barre (es. ¨
45454854,84584584,8458456¨).
£slrarre InIormazIonI da queslo IIIe rIchIe-
derebbe Ia scrIllura dI IunzIonI medIamenle
soIIslIcale che dovrebbero lener conlo deIIe
vIrgoIe come separalorI deI campI. InoIlre do-
vrebbero consIderare I casI dI campI opzIonaII
o dI numero varIabIIe, come I varI barcode, che
sono separalI anch`essI da vIrgoIe, ma sono In
numero varIabIIe (8 neI prImo esempIo, 1 neI
4XHOORGHOODJHVWLRQH
GHOOHVWULQJKHqXQ
SUREOHPD´XQLYHUVDOHµ
1DX001-1.045826,1,"AL1M","DL¦Lk1b","lkU11A","MLLL
1kLN1.","K0",2002-09-29
1DX001-2.45454354,34534534,3453456
1DX002-1.022342,,"AL1M","CONlLZ","LA111C","SCAMOk.
MASA",¦Z
1DX002-2.3243441
1DX003-1.111134,,AL1M,CONlLZ,LA111C,LA11L AL1CL,,
2002-12-29
1DX003-2.232454354,13203456
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
cenlI allraverso Ia rIcerca dI corrIspondenze
dI leslo. Ie espressIonI regoIarI operano suIIe
slrInghe, e Ie slrInghe pIu sempIIcI sono co-
slIluIle da sIngoII carallerI. Ia maggIor parle
deI carallerI corrIsponde sempIIcemenle a se
slessa, quIndI A corrIsponderà aIIa slrInga ¨a¨
(è deIInIbIIe II comporlamenlo suIIe maIusco-
Ie o mInuscoIe).
,PHWDFDUDWWHUL
ÀIcunI carallerI assumono sIgnIIIcalI parlI-
coIarI e vengono chIamalI melacarallerI. Se
vogIIamo che queslI vengano Invece Inlerpre-
lalI come carallerI ordInarI, dovranno essere
prolellI, cIoè sempre precedulI daI melacaral-
lere ¨\¨. £ccone una IIsla compIela:
| \ ¦ | { ) ´ $ ? + * .
I melacarallerI coslIluIscono uno deI Ion-
damenlI deIIa polenza deIIe espressIonI re-
goIarI.
£ possIbIIe poI specIIIcare un InsIeme dI ca-
rallerI usando Ie parenlesI quadre. Àd esem-
pIo ¨jabc|¨ corrIsponderà a uno quaIsIasI deI
carallerI compresI lra Ie parenlesI; per sem-
pIIIIcare Ia nolazIone, I`InlervaIIo compIelo lra
due carallerI può essere abbrevIalo usando II
lrallIno (-), quIndI I`esempIo sopra è equIva-
Ienle a ¨ja-c|¨. £ possIbIIe IndIcare un caral-
lere eslerno a un InlervaIIo, usando II mela-
carallere ¨´¨; per esempIo ¨j´c|¨ corrIspon-
derà a quaIunque carallere eccello ¨c¨, ma
¨j´|¨ corrIsponderà sempIIcemenle a ¨´¨.
InIallI evenluaII melacarallerI compresI lra
¨j¨ e ¨|¨ verranno presI aIIa Iellera, quIndI
¨j||¨ corrIsponderà a ¨|¨. Ie Ieg£x adIacenlI
vengono concalenale, per cuI se À e £ sono
due espressIonI regoIarI, À£ è un`espressIo-
ne regoIare; se una slrInga p corrIsponde ad
À e un`aIlra slrInga q a £, Ia slrInga pq corrI-
sponderà ad À£.
IossIamo coslruIre InsIemI dI carallerI con-
calenando InlervaIII, ad esempIo ¨ja-zÀ-Z|¨.
InlervaIII come queslo possono essere spe-
cIIIcalI lramIle parlIcoIarI sequenze che cor-
rIspondono a cIassI dI carallerI; eccone aIcu-
ne:
\r corrIsponde ad un InIzIo rIga
\n corrIsponde ad un newIIne
\l corrIsponde ad una labuIazIone o uno
spazIo
\d corrIsponde a una quaIsIasI cIIra decIma-
Ie; è equIvaIenle a j0-9|
\I corrIsponde a un quaIsIasI carallere che
non sIa una cIIra; è equIvaIenle a j0-9|
\s corrIsponde a uno spazIo bIanco
\S corrIsponde a un quaIsIasI carallere che
non sIa uno spazIo bIanco; è equIvaIenle a
j´ \l\n\r\I\v|
\w corrIsponde a un quaIsIasI carallere aIIa-
numerIco; equIvaIe a: ja-zÀ-Z0-9_|
\W corrIsponde a un quaIsIasI carallere non
aIIanumerIco; equIvaIe a: j´a-zÀ-Z0-9_|
OIlre che a segnaIare laII sequenze, ¨\¨ svoIge
Ia IunzIone dI proleggere carallerI specIaII, Ia-
cendo sI che vengano InlerprelalI come caral-
lerI normaII, come gIà accennalo precedenle-
menle. £sIslono InoIlre aIlrI melacarallerI:
. corrIsponde a un quaIsIasI carallere eccel-
lo un newIIne.
´ corrIsponde aII`InIzIo deIIa slrInga; se è
allIva I`opzIone MuIlIIIne, presenle In lulle Ie
prIncIpaII ImpIemenlazIonI dI Iegex, queslo
melacarallere è da Inlerprelare anche come
¨subIlo dopo un newIIne¨. InoIlre serve per
specIIIcare un InlervaIIo dI carallerI lramIle
¨compIemenlo¨, come rIporlalo sopra.
$ corrIsponde aIIa IIne deIIa slrInga; In mo-
daIIlà MuIlIIIne sIgnIIIca anche ¨subIlo prI-
ma dI un newIIne¨; ¨campo¨ corrIsponde sIa
a ¨campo¨ che a ¨campobasso¨, ¨campore-
se¨ ecc. menlre ¨campo$¨ corrIsponde soIo
a ¨campo¨.
£ possIbIIe InoIlre geslIre Ie rIcezIonI dI leslo.
II melacarallere '*` specIIIca che Ia Ieg£x che
Io precede (può essere un sIngoIo carallere,
ma ad esempIo anche un InlervaIIo ja-z|) può
rIpelersI zero o pIu voIle, quIndI ad esempIo
pIp*o lrova corrIspondenza In ¨pIo¨ (zero ¨p¨),
¨pIpo¨, ¨pIppo¨, ¨pIpppo¨ e cosI vIa.
SImIIe è II comporlamenlo dI ¨'+¨, che spe-
cIIIca che Ia Ieg£x che Io precede può rIpe-
lersI una o pIu voIle (allenzIone a laIe dIIIe-
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
Sinlassi delle Fegular Expression
CAFATTEFE DESCF¦Z¦OÑE
·
íarca il carallere che segue cone una backrelerence, se seguilo da un
nunero, o cone un carallere speciale di escape, se seguilo da un carallere.
Ad esenpio ·! avverle che, a queslo punlo della slringa, si inconlrerà lo
slesso pallern delinilo nel gruppo n. !. Viceversa, ·n, ad esenpio, indicherà
la presenza di un newline. ¦nline, se si vuol indicare la presenza di un carallere
di escape nella slringa, il nelacarallere · verrà ulilizzalo cone prelisso per
indicare che quello che segue va inlerprelalo cone un carallere e non cone
un nelacarallere. Ad esenpio se volessino indicare la presenza di un ÷ nella
slringa, dovrenno scrivere ·÷
´
¦ndica l'inizio della slringa. Se è inposlala l'opzione íulliline, indica l'inizio di
una nuova riga.
$
¦ndica la line della slringa. Se è inposlala l'opzione íulliline, indica la line di
nuova riga.
¯
Ellellua il nalch della solloslringa precedenle in nodo ileralivo, cioè indica
che l'espressione precedenle può essere presenle da 0 a piu volle. Ad
esenpio, zo¯ valida "z" e "zoo". ¯ è equivalenle a ¦0,}.
÷
Ellellua il nalch della solloslringa precedenle in nodo ileralivo, cioè indica
che l'espressione precedenle può essere presenle da ! a piu volle. Ad
esenpio, zo÷ valida "zo" e "zoo". ÷ è equivalenle a ¦!,}.
`
Ellellua il nalch della solloslringa precedenle in nodo ileralivo, cioè indica
che l'espressione precedenle può essere presenle 0 o ! volla. Ad esenpio
"do|es)`" valida "do" o "does". ` è equivalenle a ¦0,!}
¦n}
Ellellua il nalch della solloslringa precedenle per esallanenle n volle. Ad
esenpio, 'o¦2}' ellellua il nalch di parole cone "Food", na non di parole
cone "Tod" o "Foool".
¦n,}
Ellellua il nalch della solloslringa precedenle per n o piu volle. Ad esenpio,
'o¦2,}' ellellua il nalch di parole cone "Food", "Foool" ecc.
¦n,n}
Ellellua il nalch della solloslringa precedenle presenle da n ad n volle. Ad
esenpio, 'o¦2,4}' ellellua il nalch di parole cone "Food", "Foool", "Saoooo",
na non di parole cone "Fod" o "Teoooooos".
`
Oueslo nelacarallere assune un signilicalo dillerenle da quello già
osservalo, se segue uno degli allri nelacaralleri |¯, ÷, `, ¦n}, ¦n,}, ¦n,n}).
La dillerenza consisle nel lallo che, in quesla nodalilà, il nolore cerca di
ellelluare il nalch del ninor nunero possibile di caralleri. Ad esenpio, la
slringa "oooo" solloposla al pallern 'o÷' prenderebbe lulle le 'o' |quindi
'oooo'), invece solloposla al pallern 'o÷`' la il nalch di una singola "o".
.
Ellellua il nalch di lulli i caralleri eccello il "·n".
|pallern)
Ellellua il nalch di pallern e callura il risullalo. ¦ nalch cosi callurali vengono
delli anche Cruppi.
;HILSSH Le FegEx in breve
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
|`:pallern)
Ellellua il nalch di pallern, na non callura il risullalo.
|`~pallern)
Ellellua il nalch di pallern in qualsiasi punlo dove conincia nella slringa da
analizzare. Ñon callura il gruppo, na non consuna nenneno caralleri e quindi
può essere usalo in abbinanenlo ad allri pallern sulla slessa solloslringa. Ad
esenpio 'vindows |`~95|93|ÑT|2000)' ellellua il nalch di "vindows" in
"vindows 2000" na non di "vindows" in "vindows 3.!".
|`!pallern)
Cone il caso precedenle, na in relalivanenle a solloslringhe che non
conlengono pallern al loro inlerno.
x|y
Ellellua il nalch di x oppure y. Ad esenpio, 'z|lood' ellellua il nalch di "z" o
"lood". '|z|l)ood' ellellua il nalch di "zood" o "lood".
¦xyz|
Ellellua il nalch di un sel di caralleri conlenulo lra le parenlesi quadre. Ad
esenpio '¦abc|' ellellua il nalch di lulli i caralleri "a", "b" e "c".
¦´xyz|
Ellellua il nalch di lulli i caralleri esclusi quelli delinili in un sel di caralleri
conlenulo lra le parenlesi quadre. Ad esenpio '¦´abc|' ellellua il nalch di
lulli i caralleri eccello "a", "b" e "c".
¦a-z|
Ellellua il nalch di un range di caralleri conlenulo lra le parenlesi quadre,
che va da "a" a "z". Ad esenpio '¦a-d|' ellellua il nalch di lulli i caralleri "a",
"b" e "c" e "d".
¦´a-z|
Ellellua il nalch di lulli i caralleri esclusi quelli delinili in un range di caralleri
conlenulo lra le parenlesi quadre, che va da "a" a "z". Ad esenpio '¦´a-d|'
ellellua il nalch di lulli i caralleri eccello "a", "b" e "c" e "d".
·b
Ellellua il nalch di un pallern che però non si lrova alla line di una parola. Ad
esenpio, 'er·b' ellellua il nalch di 'er' in "never" na non di 'er' in "verb".
·B
Ellellua il nalch di un pallern che però si lrova alla line di una parola. Ad
esenpio, 'er·b' ellellua il nalch di 'er' in "verb" na non di 'er' in "never".
·cx
Ellellua il nalch di un qualsiasi carallere di Conlrol indicalo da x |in pralica
rappresenla una sequenza Conlrol÷x).
·d
Ellellua il nalch di una cilra. È l'equivalenle di ¦0-9|.
·D
Ellellua il nalch di qualsiasi cosa che non sia una cilra. È l'equivalenle di
¦´0-9|.
·l
Ellellua il nalch di un lorn-leed. È l'equivalenle di ·x0c e ·cL.
·n
Ellellua il nalch di un carallere newline. È l'equivalenle di ·x0a e ·cJ.
·r
Ellellua il nalch di un carriage relurn |rilorno carrello). Equivalenle a ·x0d e
·cí.
·s
Ellellua il nalch di qualsiasi lipo di spazio bianco inclusi spazi, lab, lorn-leed
ecc. Equivalenle a ¦·l·n·r·l·v|.
·S
Ellellua il nalch di qualsiasi carallere esclusi quelli di lipo di spazio bianco
|spazi, lab, lorn-leed ecc.) Equivalenle a ¦´·l·n·r·l·v|.
·l
Ellellua il nalch di un lab. Equivalenle a ·x09 e ·c¦.
·v
Ellellua il nalch di un lab verlicale. Equivalenle a ·x0b e ·cK.
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
renza!). QuIndI ¨pIp+o¨ lroverà corrIsponden-
za In ¨pIpo¨, ¨pIppo¨, ¨pIpppo¨ e cosI vIa, ma
non In ¨pIo¨ (aImeno una ¨p¨).
IIu rIslrello è II comporlamenlo dI ¨?¨, che
specIIIca che Ia Ieg£x che Io precede può
rIpelersI zero o una voIla. QuIndI Ia noslra
¨pIp?o¨ lroverà corrIspondenza soIo In ¨pIo¨
o ¨pIpo¨.
Iesla II modIIIcalore pIu compIesso lra queIII
dedIcalI aIIe rIpelIzIonI: {m,n}, con m e n In-
lerI decImaII. £sso specIIIca che deIIa Ieg£x
che Io precede vanno rIcercale un numero dI
corrIspondenze compreso lra m e n, II massI-
mo possIbIIe. n può essere omesso, In laI caso
vIene preso un IImIle superIore laImenle aIlo
da poler essere consIderalo InIInIlo agII eIIel-
lI pralIcI. Àd esempIo ¨ar{1,8}gh¨ può corrI-
spondere ad ¨argh¨, ¨arrgh¨ e ¨arrrgh¨, ma
non ad ¨agh¨ o ¨arrrrgh¨.
In rIassunlo dI queslI melacarallerI e nume-
rosI aIlrI sono descrIllI neIIa 7DEHOOD, che è
da InlendersI come rIIerImenlo per Io sludIo
deIIe IeguIar £xpressIon.
/DJHVWLRQHGHLJUXSSL
In aIlro Imporlanle eIemenlo deIIe Ieg£x è
Ia geslIone deI gruppI. II concello è eIemen-
lare: è possIbIIe conservare deIIe occorrenze
dI solloslrInghe rIcavala daIIa Ieg£x In va-
rIabIII parlIcoIarI delle dI JUXSSR, Inserendo
I`espressIone denlro parenlesI londe. I`Idea è
queIIa dI eslrarre deIIe sollo-InIormazIonI daI-
I`InIormazIone prIncIpaIe e dI polervI accede-
re In modo sImboIIco e nomInalIvo allrIbuen-
do un nome a cIascun gruppo, aImeno In aI-
cune deIIe ImpIemenlazIonI dI Ieg£x. VedIa-
mo un esempIo: ¨(abc)¨ callura una sequenza
dI carallerI ¨abc¨ e Ia melle In un gruppo. Se
voIessImo dare un nome a queslo gruppo, ad
esempIo ¨sequenza¨, dovremmo scrIvere un
Ieg£x deI lIpo:

{?<sequenza·abc)

£ possIbIIe, aII`Inlerno dI una sIngoIa espres-
sIone, deIInIre dIIIerenlI gruppI. InoIlre è pos-
sIbIIe rIIerIrsI ad un gruppo Inconlralo neI-
Ia scansIone deIIa slrInga, anche neI seguIlo
deIIa slessa:
\s*1{?<m1o_qruppo·zoe|boe)\s*\k<m1o_qruppo·
è da Inlerprelare come cerca, dopo una cerla
sequenza dI carallerI coslIluIla da spazI bIan-
chI (\s*) seguIlI da una ¨I¨, un gruppo coslIluI-
lo daIIe paroIe ¨zoe¨ oppure ¨boe¨. À queslo
gruppo vIene assegnalo II nome ¨mIo_grup-
·w
Ellellua il nalch di un qualsiasi carallere allabelico, incluso l'underscore.
Equivale a '¦A-Za-z0-9_|'.
·v
Ellellua il nalch di un qualsiasi carallere esclusi i caralleri allabelici
|conpreso l'underscore). Equivale a '¦´A-Za-z0-9_|'.
·xn
Ellellua il nalch di n, dove n è un valore di escape esadecinale. Tali valori
devono occupare esallanenle due cilre. Ad esenpio, '·x4!' ellellua il nalch
di "A". '·x04!' è l'equivalenle di '·x04' G "!". Pernelle di ulilizzare codici ASC¦¦
nelle regular expression.
·nun
Fappresenla una backrelerence, cioè indica il ripelersi di un pallern già
calluralo in un gruppo precedenle e precisanenle nel gruppo in posizione
nun.
·n
¦denlilica un carallere ollale o una backrelerence. Se ·n è precedulo da
alneno n gruppi callurali, allora è da inlendere cone una backrelerence.
Allrinenli, n è un valore di escape ollale |0-7).
·nn
¦denlilica un carallere ollale o una backrelerence. Se ·nn è precedulo da
alneno nn gruppi callurali, allora è da inlendere cone una backrelerence.
Allrinenli, n ed n sono valori di escape ollali |0-7).
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
po¨. SuccessIvamenle, dopo aver lrovalo aI-
lrI spazI vuolI, deve necessarIamenle lrovarsI
un`aIlra sequenza dI carallerI IdenlIca aI grup-
po ¨mIo_gruppo¨ appena IndIvIdualo. OvvIa-
menle se II gruppo conleneva ¨zoe¨, anche
quesl`uIlIma occorrenza deve essere ¨zoe¨ e
non può essere ¨boe¨. Quesla lecnIca sI chIa-
ma bacRreIerence.
/HRS]LRQLGHOPRWRUH5HJ([
InoIlre sono prevIsle una serIe dI ¨opzIo-
nI¨ che delermInano II comporlamenlo deI-
Ia scansIone slrInga. £sse sono dIrellamen-
le ImposlabIII daI modeIIo ad oggellI. £cco-
ne Ie prIncIpaII:
xSIngIeIIne consIdera Ia slrInga da anaIIz-
zare come se Iosse dIsposla su un`unIca rIga,
InIallI I mela-carallerI ¨´¨ e ¨$¨ vengono In-
lesI come InIzIo e IIne slrInga;
xMuIlIIIne consIdera Ia slrInga da anaIIzza-
re come se Iosse dIsposla su pIu rIghe sepa-
rale da un <CIII>, InIallI I mela-carallerI
¨´¨ e ¨$¨ vengono InlesI come InIzIo e IIne
dI cIascuna rIga;
xIgnoreCase non Ia dIslInzIone lra maIusco-
Ie e mInuscoIe.
ÀIcune ImpIemenlazIonI dI Ieg£x pIu rIc-
che, come queIIa presenle In .N£J, IornIscono
una serIe ben pIu ampIa dI opzIonI e, sopral-
lullo, Ia possIbIIIlà dI deIInIrIe dIrellamenle
neI pallern deIIa Ieg£x, In modo da non do-
ver Imposlare nuIIa daII`eslerno.
$QDOLVLGHOODVWULQJDGHOO·HVHPSLR
NeII`esempIo abbIamo presenlalo una slrIn-
ga dI leslo conlenenle dalI reIalIvI ad arlIcoII
dI magazzIno, come esempIo sIgnIIIcalIvo dI
slream dI lesl a cuI sI può appIIcare un`anaII-
sI per reguIar expressIon. OsservIamo InIallI
Ia seguenle Ieg£x In grado dI eslrarre I dalI
daIIo slream In queslIone:
1DX{\d¦3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d¦4))-{\d¦2))-{\d¦2))|)|)\r\n1DX\1-
2.{\d*){?.,{\d*)|){?.,{\d*)|){?.,{\d*)|){?.,{\d*)|)
Ànche se, aII`apparenza, sembra quanlo dI
pIu IncomprensIbIIe sI possa lrovare, In reaIlà
un`anaIIsI pIu allenla sveIa II sIgnIIIcalo daI-
I`espressIone moslrandone, lullo sommalo, Ia
sempIIcIlà. Ia Ieg£x InIzIa con ¨IIX(\d{8})-1:
¨, sIgnIIIca che cerca proprIo Ia slrInga ¨IIX¨
seguIla da un numero dI lre cIIre (¨\d{8}¨) che
vIene conservalo In un gruppo che, essendo
II prImo deIIa Iegex, verrà IdenlIIIcalo con 1.
£sso sarà seguIlo a sua voIla daIIa ¨-1:¨. Ver-
rebbero lrovale cosI Ie solloslrInghe ¨IIX001-
1:¨, ¨IIX002-1:¨ e ¨IIX008-1:¨
£cco Ia porzIone dI IegWx che sI occupa dI
queslo (da quI In avanlI Ie parlI dI cuI sI par-
Ia sono evIdenzIale In grassello):
10X{\d(3))-1.{\d+),\d*,.
À queslo punlo lrovIamo II pallern ¨(\d+)¨,
che IndIca Ia presenza dI un numero IndeIInI-
lo dI cIIre e verrà memorIzzalo In un gruppo.
£sso conlerrà proprIo II codIce deI prodollo,
che appunlo segue Ia solloslrInga ¨IIX001-1:
¨ ed è composlo da soIe cIIre (¨045826¨):
1DX{\d¦3))-1.{\d+),\d*,.
QuIndI lrovIamo II carallere ¨,¨ seguIlo daI
pallern ¨\d*¨ che IndIca Ia possIbIIe presen-
za dI un numero che, neI record n.1 deI no-
slro slream sarà Ia solloslrInga ¨,1,¨. À que-
sla segue un`aIlra ¨,¨ e poI I`Inleressanle sol-
loslrInga:
1DX{\d¦3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"? .
£ssa eslrarrà II codIce deI Gruppo merceIeo-
IogIco DEL PRODOTTO che, neI prImo record sarà
¨ÀIIM¨. £ Inleressanle nolare che Ia presen-
za deIIe doppIe vIrgoIelle è opzIonaIe ed In-
IallI neI record n.8 sono assenlI. Ia sequenza
¨? IndIca proprIo che Ia presenza deIIe doppIe
vIrgoIelle aII`InIzIo deIIa slrInga è opzIonaIe. À
queslo punlo segue un pallern che vIene cal-
luralo In un gruppo. £sso è deI lIpo ¨(j\w|.|\
s|-|+)¨ e cIoè IndIca Ia presenza dI un numero
dI carallerI (aImeno 1 carallere come IndIca II
¨+¨) compresI neI sel j\w|.|\s|-|, cIoè un caral-
lere aIIanumerIco (¨\w¨), un punlo (¨.¨), uno
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
spazIo (¨\s) o un lrallIno (¨-¨). IercIò verran-
no callurale lulle Ie solloslrInghe composle
da una dI quesle lIpoIogIe dI carallerI, com-
presI quIndI I noslrI gruppI merceoIogIcI. Io
slesso dIscorso vaIe per II campo IamIgIIa, sol-
loIamIgIIa e descrIzIone calluralI neI gruppI
evIdenzIalI dI seguIlo:
1DX{\d¦3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?.
À queslo punlo InconlrIamo un`Inleressanle
varIanle deI gruppI vIslI IInora: I gruppI non
calluralI. InIallI, a queslo punlo deIIa slrIn-
ga lrovIamo I campI InIlà dI mIsura e Iala
deI Iollo che però sono opzIonaII, come sI può
osservare dagII aIlrI record. InIallI neI record
n.2 sono assenlI enlrambI e Ia rIga sI Inler-
rompe aI campo descrIzIone con un <CIII>.
II record n.8, Invece, presenla II soIo campo
Iala deI Iollo, ma per rIspellare Ia posIzIona-
IIlà deIIe vIrgoIe, II campo InIlà dI mIsura è
IascIalo vuolo (¨,,¨). Ier geslIre queslI casI, sI
osservI II pallern evIdenzIalo dI seguIlo neI-
Ia Ieg£x:
1DX{\d¦3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d(4))-{\d(2))-{\d(2))|)|)\r\.
II lullo è InserIlo In un gruppo, preIIssalo
da ¨?:¨ che IndIca appunlo dI non callurarIo.
Queslo gruppo può opzIonaImenle non con-
lenere nuIIa, come IndIcalo daIIa parle deslra
deIIa sequenza ¨..|)¨ oppure può conlene-
re aI suo Inlerno Ia sequenza ¨,¨ seguIla daI
gruppo (¨\w*¨) che conlerrà I`InIlà dI mIsura.
In reaIlà queslo gruppo polrebbe anche esse-
re vuolo e InIallI ¨\w*¨ IndIca proprIo quesla
possIbIIIlà. À queslo segue un aIlro gruppo,
non dI callura, che conlIene opzIonaImenle
Ia slrInga vuola o Ia Iala deI Iollo). £ Impor-
lanle enIalIzzare I`uso deI gruppI non dI cal-
lura perché, quando accederemo aIIa coIIec-
lIon deI gruppI calluralI, non lroveremo queI-
II con preIIsso ¨?:¨.
À queslo punlo InconlrIamo Ia sequenza
¨\r\n¨ che IndIca che Ia slrInga conlerrà un
<CIII>. Àd esso seguIrà Ia solloslrInga cal-
lurala neI gruppo n.1 che conleneva proprIo
I`IndIce deI record. Con queslo sIslema vogIIa-
mo essere cerlI che Ie InIormazIonI che slIamo
eslraendo daIIa seconda rIga deI record abbIa-
no comunque a che Iare con Io slesso record.
SI lralla quIndI dI un bacRreIerence:
1DX{\d¦3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d¦4))-{\d¦2))-{\d¦2))|)|)\r\n10X\1-
2.{\.
QuIndI dovremo lrovare Ia sequenza
¨<CIII>IIXn-2:¨ dove n rappresenla pro-
prIo I`IndIce deI record calluralo neI gruppo
1, da quI Ia sInlassI ¨\1¨. À queslo punlo cal-
lureremo I cInque barcode deI prodollo. SoIo
II prImo sarà presenle cerlamenle, gII aIlrI
quallro sono opzIonaII ed InIallI sono conle-
nulI neI soIIlo gruppo non dI callura che ne
geslIsce I`opzIonaIIlà:
1DX{\d¦3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d¦4))-{\d¦2))-{\d¦2))|)|)\r\n1DX\1-
2.{\d*){?.,{\d*)|){?.,{\d*)|){?.,{\d*)|){?.,{\d*)|)
Iallo queslo avremo cosI ¨calluralo¨ Ie InIor-
mazIonI rIIevanlI daI IIIe dI leslo da Imporla-
re. £sse cI saranno messe a dIsposIzIone daI
molore Ieg£x che andremo ad ulIIIzzare sol-
lo Iorma dI GruppI o dI SubMalch (a seconda
deII`ImpIemenlazIone).
Le Espressiohi Fegolari
soho uha fuhziohalità che
permette di ottehere risul-
tati stupefacehti attraverso
la ricerca di
corrispohdehze di testo.
9%- N. 74 - Marzo/Aprl|e 2OO7 N. 74 - Marzo/Aprl|e 2OO7 9%-
7(&1,&+( 7(&1,&+(
&RQFOXVLRQL
ÀbbIamo dalo uno sguardo InlrodullIvo, ma
suIIIcIenlemenle approIondIlo per Iar com-
prendere Ia polenza e Ia IIessIbIIIlà dI quesla
nolazIone sInlallIca II cuI soIo scopo è anaIIz-
zare e lrallare slrInghe dI leslo. Non abbIamo
Iallo aIcun rIIerImenlo ad ImpIemenlazIonI
reaII dI un molore Ieg£x, per evIlare dI Inge-
nerare I`ImpressIone che laIe sInlassI sIa Iega-
la ad una parlIcoIare ImpIemenlazIone.
Iur rIbadendo I`assoIula generIcIlà deI con-
cellI appena esposlI e Ia Ioro appIIcabIIIlà,
pressoché compIela, In lulle Ie ImpIemen-
lazIonI dI Ieg£x IornIle per Ie pIallaIorme
e per gII ambIenlI dI svIIuppo pIu dIsparalI,
neI prossImI arlIcoII osserveremo da vIcIno
I`ImpIemenlazIone IornIla da MIcrosoIl coI
molore ÀclIveScrIplIng daIIa versIone 5.6 In
poI (gIà IornIla con WIndows XI e scarIcabIIe
da j1| per Ie aIlre versIonI dI WIndows). £ssa
sarà ulIIIzzabIIe negII slessI scrIpl V£ScrIpl
o JScrIpl, ma anche da lullI gII ambIenlI dI
svIIuppo In grado dI ulIIIzzare IIbrerIe COM
(cI saranno InIallI esempI dI codIce In VIsuaI
£asIc e IeIphI).
InIIne, neI lerzo ed uIlImo arlIcoIo deIIa serIe,
anaIIzzeremo Ia soIIslIcala ImpIemenlazIone
IornIla con II IrameworR .N£J dI MIcrosoIl, os-
servandone aIcune pecuIIarIlà specIIIche che
sIrulleremo per ImpIemenlare lecnIche moIlo
soIIslIcale (come moslralo In j2|).
5LIHULPHQWL
j1| SIlo MIcrosoIl MSIN dedIcalo aIIo scrIp-
lIng ÷ hllp://msdn.mIcrosoIl.com/scrIplIng
j2| V. VessIa ÷ hIrogrammare II ceIIuIarev ÷
HoepII, 2002 ÷ CapIloII 1 e 8.