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