Sei sulla pagina 1di 11

VBJ n.

74 marzo-aprile 2007
Regular Expression parte 1
di Vito Vessia
Le Regular Expression risolvono, una volta per tutte, lannoso proble-
ma dellimplementazione di parser di stringhe pi ` u o meno sosticati.
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 limpresa 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 dinformatica 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
inuente realt` a delleditoria 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 unattivit` 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 dellinformazione 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.
Limpaginazione 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 ne 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
identicazione della testata.
Manoscritti e foto originali, anche se non pubblicati, non
si restituiscono.
Contenuto pubblicitario inferiore al 45%.
La biograa dellautore riportata nellarticolo e sul
sito www.infomedia.it ` e di norma quella disponibi-
le nella stampa dellarticolo o aggiornata a cu-
ra dellautore stesso. Per aggiornarla scrivere a
info@infomedia.it o farlo in autonomia allindirizzo
http://mags.programmers.net/moduli/biograa
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 II (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 IIMS 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 |oe||a e sv//oa a//caz/on/ e /|amewo|k
occoandos/ de// ase||/ 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 .NJ 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. IIII), SolloIamIgIIa (es. IIIJ-
J), IescrIzIone (es. MI JINJ.), 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
SUREOHPDXQLYHUVDOH
1DX001-1.045826,1,"AL1M","DLLk1b","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 jc| 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 Iegx 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: ja-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 Iegx 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 Iegx 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 DESCFZOE

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, 'o2}' 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,
'o2,}' 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, 'o2,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, 'erb' 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, 'erb' 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 Conlrolx).
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 lnrlv|.
S
Ellellua il nalch di qualsiasi carallere esclusi quelli di lipo di spazio bianco
|spazi, lab, lorn-leed ecc.) Equivalenle a lnrlv|.
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 Iegx 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 Iegx
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 Iegx
Ia geslIone deI gruppI. II concello eIemen-
lare: possIbIIe conservare deIIe occorrenze
dI solloslrInghe rIcavala daIIa Iegx 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 Iegx. 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
Iegx deI lIpo:

{?<sequenzaabc)

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_qruppozoe|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 Iegx pIu rIc-
che, come queIIa presenle In .NJ, IornIscono
una serIe ben pIu ampIa dI opzIonI e, sopral-
lullo, Ia possIbIIIl dI deIInIrIe dIrellamenle
neI pallern deIIa Iegx, In modo da non do-
ver Imposlare nuIIa daII`eslerno.
$QDOLVLGHOODVWULQJDGHOOHVHPSLR
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 Iegx In grado dI eslrarre I dalI
daIIo slream In queslIone:
1DX{\d3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d4))-{\d2))-{\d2))|)|)\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 Iegx 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{\d3))-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{\d3))-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{\d3))-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 Iegx:
1DX{\d3))-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{\d3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d4))-{\d2))-{\d2))|)|)\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{\d3))-1.{\d+),\d*,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\
s|-|+)"?,"?{|\w|.|\s|-|+)"?,"?{|\w|.|\s|-|+)"?{?.
,"?{\w*)"?{?.,{\d4))-{\d2))-{\d2))|)|)\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 Iegx 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 Iegx, 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 Iegx 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 VScrIpl
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 .NJ 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.