E }{Pr[s$|0n R Û| @rlatel.upf.edu/traductica/modular2000/nous/ExpressionsRegulars.pdf1.1.3. Una...
Transcript of E }{Pr[s$|0n R Û| @rlatel.upf.edu/traductica/modular2000/nous/ExpressionsRegulars.pdf1.1.3. Una...
1
E
}{Pr[s$|0n$
R
[GÛ|_@r$
2
INTRODUCCIÓ
El treball present pretén ser una petita aproximació a les expressions regulars. Mitjançant uns quants exemples pràctics, s’intentarà fer veure al lector que aquest llenguatge que a primer cop d’ull pot semblar poc simpàtic, pot arribar a ser‐ho molt ja que facilita la feina a tots aquells que fem servir l’ordinador.
El treball està molt centrat en els editors de text perquè és l’eina que més gent utilitza, i la majoria d’exemples estan fets amb el MS Word. Això no vol dir que els exemples que estan fets amb Word no es puguin fer servir en altres aplicacions. Com es veurà més endavant, la cosa és més aviat a l’inrevés: tot el que es pot fer amb el Word es pot fer amb un altre processador de textos i, per norma general, de manera més fàcil i complerta. Al final del document hi trobareu una taula resum amb les equivalències (en algun cas els resultats són aproximats) entre les expressions que s’han utilitzat en Word i en Openoffice. Totes les imatges tenen un enllaç cap a la taula resum (cal ctrl?).
Per altra banda, també hi ha alguns exemples d’altres aplicacions en les quals les expressions ens poden ser de gran utilitat, com ara en el renombrament de fitxers, en la consulta de diccionaris o en la cerca de codis.
Com podreu comprovar, no hi ha mai una fórmula única que serveixi per resoldre tots els problemes semblants i molts cops trobareu que l’expressió que escriviu no dóna el resultat esperat. Un dels avantatges de les expressions regulars és que hi ha molts camins per arribar a un mateix punt i que segons quin camí agafes, pots descobrir un caminet que et dugui a un punt llunyà però no per això menys interessant. En certa manera és com un joc. Us animo doncs, a jugar a aquest joc que pot ajudar‐vos tant a uanyar temps agafant, això sí, camins i‐regulars. g
Joan Bonmatí Fernández 6‐12‐2007
1. EDITORS DE TEXT 1.1. MICROSOFT WORD En Word, les expressions regulars s’anomenen “carácteres comodín” en castellà o “Wildcards” en anglès. Seguint la tònica de Microsoft, han decidit no només canviar el nom, sinó també canviar els caràcters, de forma que resulta més complicat per la gent que coneix les expressions regulars “més estàndards” fer-les servir en Word. O al revés, la gent que està avesada al Word després té problemes per usar expressions regulars en altres aplicacions. L’avantatge més gran del Word és que molta gent ja està acostumada a la seva interfície però en l’ús de les expressions regulars no destaca en absolut. Un dels desavantatges més clars és que no hi ha l’opció d’utilitzar l’expressió 0 o més resultats {0,x}, ja que el 0, per Word no existeix. Això no vol dir, en absolut, que haguem de descartar el Word per fer aquest tipus de cerques. Com veureu, té moltes possibilitats. Però en podria tenir més.
3
uia
Si voleu saber el significat i la utilitat dels caràcters comodins en Word, al mateix quadre de cercar hi apareixen els símbols amb la seva funció simplificada (com es pot veure a la imatge). També teniu l’opció d’anar a l’ajuda de Word (prement F1). Però com que no està gaire ben explicat, millor que seguiu llegint i mirant els exemples o que consulteu aquesta petita g .
1.1.1. Una de les utilitats de les expressions regulars pot ser per ordenar adreces de correu electrònic. Val a dir que hi ha molts servidors i gestors de correus que faciliten la importació i exportació d’adreces de correu electrònic. Tot i amb això, en alguns casos pot ser útil utilitzar les regex per modificar documents. Aquí se’n mostren alguns exemples fets a partir d’una llista de contactes de Gmail.
ORDENACIÓ DE CORREUS ELECTRÒNICS
1.1.1.1. Llista d’adreces de correu El fet de que les adreces estiguin separades per < >, facilitarà el fet de separar la part de l’adreça del nom. Així, podem seleccionar fàcilment tot el que hi ha des de que acaba na adreça (\>) fins que en comença una altra per mitjà de la fórmula “(\>)*(\<)” per al de reemplaçar‐ho. ut
Capt 1 Si reemplacem el nom del contacte per una marca de paràgraf (^13), ens quedaria una llista de mails “neta”:
4
5
Capt
1.1.1.2. Nom i adreça Si volguéssim mantenir el nom i l’adreça, podríem escriure l’expressió següent:
t 3
2
Cap Els parèntesis fan la funció de grup i això permet que a l’hora de reemplaçar puguem escollir l’ordre que més ens convingui o afegir‐hi caràcters. En aquest cas, el que farem és separar el nom de l’adreça per “:” i separar cada contacte per una marca de paràgraf (per mitjà de la substitució de la coma). La llista resultant és la següent:
Capt 4
1.1.1.3. Punt cat
na altra possibilitat que tenim és la de canviar una U
6
part de l’adreça electrònica. Fins o fa gaire, n nent l’ús del domini .cat, i ue moltes empreses i institucions tenen el domini per duplicat o triplicat, pot tenir na certa lògica canviar el nom. De moment, però, sí que funciona canviar el bcn.es pel cn.cat però no el hotmail.com pel hotmail.cat. a fórmula que utilitzarem al quadre reemplaçar és aquesta: “<(*\@)(*.)(*)>”. El fet
els “perillosos” caràcters * (per la quantitat de resultats que poden donar) fa que haguem de marcar les marques d’inici i fi de paraula (<>). Els parèntesis serviran altre cop per poder crear grups diferents. El resultat de la cerca i reemplaçament és el següent: Capt 5
n o era una cosa gaire útil, però ara que s’està estequbLd’utilitzar
7
1.1.2. DATES Una de les característiques més interessants de les regex és que ens donen la possibilitat de canviar el format de les dates de manera ràpida i senzilla i ens evita la feina feixuga d’anar canviant un per un totes les dates. A continuació es plantegen alguns exemples de com fer servir el canvi de dates.
1.1.2.1. Canvi de format de dates senzill
Capt 6
Com que hem utilitzat els parèntesis per marcar grups, ara, al quadre reemplaçar podrem decidir l’ordre de dies, mesos i anys que ens convingui més. En aquest cas s’inverteix completament segons \3/\2/\1, com es mostra a continuació:
Capt 7
i volguéssim que ens quedessin en format MM/DD/AAAA tan sols hauríem de canviar a fórmula del quadre reemplaçar per la següent: \2/\1/\3 Sl
8
1.1.2.2. Canvi de format de data complex Existeixen múltiples opcions d’escriure les dates. Possiblement, el format més estès en català és el 2 d’octubre del 2007. Aquest canvi, òbviament, no es pot fer de manera directa però sí que es pot crear una fórmula que tan sols canviant el nombre de mes, permeti canviar automàticament totes les dates. El primer cop haurem de fer l’operació 2 vegades (pels 12 mesos) però si gravem unes macros, ja tindrem sempre un traductor automàtic” de dates. 1“
Capt 8
1.1.2.3. Canvi de format de data i d’hora Si a més de canviar la data, volem canviar l’hora, haurem d’afegir la fórmula marcada a ontinuació. Al quadre reemplaçar, podríem afegir una coma entre la data i l’hora, que niria separada per un punt i seguida d’una h, com es pot veure:
9
ca
Capt 9
Dl
’aquesta manera, després de fer els canvis de dates i hores, ens quedaria un text amb es dates i hores “en català”:
Capt. 10
10
1.1.3. Una altra de les utilitats de les regex és que ens permet trobar paraules o paràgrafs consecutius repetits.
REPETICIONS
1.1.3.1. Repetició de paraules Per detectar paraules repetides utilitzarem l’expressió <(*)> <\1>, que identifica qualsevol seqüència de caràcters que no estigui al mig d’una paraula “<(*)>” i que estigui repetida “<\1>” després d’un espai. Si volem suprimir la paraula repetida simplement haurem d’escriure “\1” al quadre reemplaçar. S’ha d’anar amb compte amb aquest reemplaçament perquè hi ha paraules i expressions de la nostra llengua que nclouen la repetició de paraules, com ara pica pica, o simplement en un diàleg, hi ha araules que es poden repetir, com ara prou prou. ip
Capt 11
11
12
1.1.3.2. Paràgrafs duplicats El mateix que es pot fer amb les paraules, es pot fer amb els paràgrafs duplicats. ’expressió que farem servir en aquest cas és “(*^13*)@\12” al quadre cercar i \1 al uadre reemplaçar. Lq
Capt 12 E l resultat del reemplaçament és el següent:
Capt 13
1.1.4. Les fórmules que representen els compostos químics sovint són un maldecap ja que una mateixa paraula conté diferents formats (lletres majúscules i minúscules i números en subíndex). El fet que només una part de la unitat tingui un format diferent complica molt les coses a l’hora d’intentar treballar de forma ràpida i automatitzada. Segurament el fet d’haver de canviar el format molt sovint quan s’escriu un text que té fórmules químiques, ha fet que sovint ens arribin a les mans textos que no utilitzen el ubíndex (potser per mandra). El que es proposa en el següent exemple és una manera e substituir fórmules de l’estil CO2 per la formulació correcta CO
SUBÍNDEXS I SUPERÍNDEX
sd
2.
1.1.4.1. Subíndex: compostos químics Les limitacions de Microsoft Word en l’ús d’expressions regulars fan que l’exemple el reemplaçament de fórmules s’hagi de fer en diferents parts i que no sigui del tot precís. En primer lloc, cercarem “([AZaz])([09]@)([!09])”, és a dir una lletra seguida d’un ombre que no vagi seguit d’un altre nombre. Això ens donarà un resultat com el que s mostra a continuació: ne
13
Capt 14
Pel problema de format que s’ha comentat abans, utilitzarem un caràcter poc usat (#) i el posarem entre la lletra i el nombre al quadre reemplaçar \1#\2\3. Haurem de repetir com a mínim un cop per tal de que també faci el reemplaçament al costat del segon nombre en compostos com l’H2SO4. Un cop tenim tots els números de les fórmules precedits per un # ja podem cercar (#)(09). Al quadre reemplaçar hi posarem només \2 ja que el símbol # ja no el necessitem. Per posar l’opció subíndex haurem d’anar a la pestanya Formato Fuente i marcar la casella corresponent.
Capt 15
’aquesta manera, una bona part dels compostos químics més típics els tindrem amb la ormulació que els correspon: Df
Capt 16
14
1.1.4.2. Superíndex: superfícies i vo Utilitzant el mateix procés que en
lums
l’exemple anterior podem modificar les unitats de superfície i de volum. El que canvia és que en el primer quadre de cercar hi apareix (m)([23])> i que a l’hora de reemplaçar el caràcter #, hem de canviar el format a superíndex, com mostren les següents imatges:
15
Capt 17
Capt 18
1.1.5. XATS i XATES Les expressions regulars també ens poden servir per netejar les converses desades que hem tingut en xats. D’aquesta manera ens estalviarem de llegir coses com ara “[QKrota] :D Nit loca a Pachà! Rska mxma, i ara studiaaaa! :P dice:” i potser així serem capaços d’entendre una mica de què anava la conversa tinguda.
1.1.5.1. Conversa Messenger En aquesta conversa del Messenger s’eliminarà l’hora, i es reemplaçaran els àlies dels participants per uns noms més comprensibles. Això es pot fer mitjançant l’expressió egular (\[[09]{2}:[09]{2}:[09]{2}\]) (àlies:) pel nom que vulguem reemplaçar, om mostra la imatge: rc
16
ixí, ens pot una conversa on hi participen Jo i Ella en comptes de badant i fai lo que p, om mostra la imatge:
Capt 19 Ac
Capt 20
1.1.5.2. Conversa xat Una altra opció que tenim és la d’eliminar tots els noms dels participants d’un xat per tenir simplement el “contingut” de les converses. En aquest cas, per mitjà de la fórmula “([09]{2}:[09]{2})*:” reemplaçaríem els àlies dels participants i l’hora per l’àlies genèric poca feina diu:
17
Capt 21
1.2. OPENOFFICE WRITER L’Openoffice és un paquet de programari d’oficina similar a l’Office de Windows, tot i que en certs aspectes és millor. Es tracta de programari lliure i gratuït i a més és compatible tant en Windows com en Linux com en Mac. L’equivalent del Word de Microsoft és l’Openoffice Writer. En la versió catalana del Writer s'utilitza el terme “expressions regulars”. Les versions més noves que la 1.0 incorporen la possibilitat d'usar expressions regulars. En aquest sentit, Openoffice Writer és molt millor que Microsoft Word, ja que té un ventall de possibilitats (i de metacaràcters) més elevat i a més la sintaxis que utilitza és més estàndard i per tant les “fórmules” utilitzades ens poden servir en altres programes d'expressions regulars. Els caràcters que es poden fer servir estan disponibles a l’ajuda (F1) d’Openoffice i també apareixen recollides a l’entrada regular expressions de wikipedia. Una guia interessant per aprendre a fer anar les regex és aquesta.
1.2.1. IPS I CODIS DE COLOR Les expressions també serveixen per cercar en fitxers que no estan en format doc. Així, podrem cercar dins de pàgines escrites en html o en algun altre llenguatge de programació.
18
1.2.1.1. Detecció d’IPs L’expressió per reconèixer adreces Ip (v4) és la següent: (([01]?[09]{1,2}\.)|(2[04][09]\.)|(25[05]\.)){3}(([01]?[09]{1,2})|(2[04][09])|(25[05])). Si volguéssim reconèixer l’adreça física (MAC Adress) l’expressió seria semblant però hi auria “:” en comptes de “.” i a més hi hauria lletres. No cal dir que aquestes xpressions s’haurien de canviar si volguéssim fer la mateixa cerca en Word. he
Capt 22
1.2.1.2. Codi colors RGB En llenguatge html, es representen els colors mitjançant tres parells d’hexadecimals que representen, per ordre, “la quantitat” de vermell, verd i blau precedits pel caràcter #. Així, si veiem una pàgina web que té uns colors que volem fer servir, podem visualitzar el codi font i localitzar els colors. Per fer‐ho, podem utilitzar l’expressió #([af]|[AF]|[0]{3}([af]|[AF]|[09]{3}. Hi ha l’opció de fer la mateix cerca per internet explicada és endavant.
19
9m
Capt 23
1.2.2. Com ja s’ha avançat, una de les utilitats més importants és la que fa referència a dades e contacte. En aquest apartat s’introdueix el reconeixement del codi postal i es erfecciona la cerca (i reemplaçament) d’adreces de correu electrònic.
ADRECES (CORREU I CODI POSTAL)
dp
1.2.2.1. Codi postal La localització del codi postal de l’Estat Espanyol es pot fer mitjançant l’expressió “\<([1]{2}|[09]|[19]|[19][09])[09]{3}\>”. De forma similar es podrien crear regex per econèixer números de telèfon o codis postals d’altres països. 9r
Capt 24
20
21
1.2.2.2. Correus electrònics OO El reconeixement d’adreces de correu electrònic és molt millor al Writer que no pas al Word. L’openoffice, gràcies a l’opció de cercar 0 ocurrències o més ({0,x}) permet el reconeixement de les adreces que després d’@ tenen dos punts, com ara @correu.udg.es. A més, també reconeix la part esquerra de l’@ que està separada per guionets o punts. L’expressió que s’ha fet servir és la següent “\<[:alnum:]*([\.|_||]{0,1})[:alnum:]*([\.|_||]{0,1})[:alnum:]*@([:alnum:]*[|_|\.]{0,3}[:alnum:]*[|_|\.]{0,2}[:alnum:]{2,3})\>”. Les propostes de reemplaçament estan recollides a l’apartat 1.1.1.1 d’aquest document.
Capt 25
22
1.2.3. XIFRES ROMANES Els nombres romans acostumen a portar maldecaps. A part de ser una mica difícils de llegir, en català, quan s’usen per parlar de segles, han d’anar en versaletes. Les expressions regulars poden ajudar a detectar i canviar el format dels números romans. En Word és molt més difícil fer una cerca precisa ja que l’expressió conté el metacaràcter {0,} que el Word no suporta.
1.2.3.1. Les versaletes i els romans Per cercar les xifres romanes escriurem l’expressió “\<(I{0,3}X{0,3})\>|({X{0,3} I[0,3}V{0,3}I{0,3})\>” al quadre cercar i & al quadre reemplaçar (significa el que ja hi ha al quadre cercar més el que hi afegim) amb l’opció versaletes marcada (a la pestanya Format...).
Capt 26
23
1.3. ALTRES EDITORS DE TEXT Hi ha molts altres editors de text que admeten l’ús d’expressions regulars. Els que tenen més suport pel que fa expressions regulars són els editors de text de llenguatges e programació i és que els regex, com ja s’ha apuntat, no només tenen aplicacions ens dfitxers .doc sinó que també en tenen en moltes altres coses. Entre els programes o llenguatges que suporten regex, hi destaquen: jEdit: Un editor de text gratuït que suporta més de 130 tipus de llenguatge. Per Windows, Linux i Mac. Powergrep: Segurament és el programa més complert d’expressions regulars. Inclou
totes les eines necessàries per editar textos però també serveix per canviar noms defitxers, entre altres coses. Només en Windows i pagant uns 100 euros. Perl: Les possibilitats de les expressions regulars són gairebé infinites. Pot resultar difícil d’entrada, degut precisament a les seves enormes possibilitats. avaJ , JavaScript, JScript, VBScript, C#, PHP, MySQL i SQL Server 2000 també suporten xpressions regulars. e
2. ALTRES APLICACIONS
Els regexs també ens poden servir per fer cerques a diccionaris, a catàlegs, per cercar fitxers, etc. De fet, encara que no en siguem gaire conscients, segur que algun cop hem fet servir algun metacaràcter de les expressions regulars. Quan no estem segurs de com s’escriu “el nom de l’autora aquella txeca que té un nom tan llarg i no me’n recordo mai si és Ardizêdrdova o amb Ardizönerrzdriva” llavors posem Ardiz* al catàleg on‐line, que és la part que estem segurs que apareixerà. Doncs bé, el * és un metacaràcter.
2.1. DICCIONARIS
Gairebé tots els diccionaris electrònics ja incorporen un mínim suport d’expressions regulars que faciliten molt la cerca de paraules que no estem gaire segurs de com ’escriuen, o simplement per cercar sufixos, afixos, etc. Tot i amb això, el suport en egex que ofereixen alguns d’aquests diccionaris, deixa bastant a desitjar. sr
2.1.1.1. DACCO
24
El Dacco és un diccionari en línia català‐anglès i anglès‐català que permet fer cerques utilitzant les expressions regulars de Perl. Això ens permet, entre moltes altres coses, cercar paraules pel seu acabament, com en un diccionari de la rima. Així, si volem fer un poema d'un ruc que cerca refugi perquè plou, podem cercar al diccionari, l'expressió“uc$” i ens donarà entrades que acaben en “uc”, com ara aixopluc.
Capt 26
2.2. MOURE FITXES
Cada cop hi ha més programes que tenen l’opció d’usar expressions regulars per cercar fitxers. Aquesta eina és cada cop més important perquè cada cop acumulem més informació i més fitxers que de vegades no sabem ni on són ni quina cara tenen. El fet de poder acotar la cerca de fitxers ens estalviarà feina de remenar carpetes. Per altra banda, la possibilitat de cercar i canviar el nom a fitxers amb nom avorrit de cop també és una opció molt interessant. Entre aquests programes, en destacarem dos perquè la interfície és “amigable” i són fàcils d’usar.
2.2.1. FLEXIBLE RENAMER Programa lliure i gratuït que permet fer canvis a noms de fitxers o carpetes per mitjà d’expressions regulars. A més, incorpora l’opció de traduir al xinès simplificat, entre ltres. En aquest exemple es mostra com es pot canviar els noms de fitxers .jpg itjançant l’expressió “\<([\d]{4})([\d]{2})([\d]{2}):”
am
25
2.3. GOOGLE CODE Una de les múltiples opcions de cerca que ens ofereix Google és la de cercar codi. La cerca es pot restringir per llenguatge (per cercar xml, per exemple, posarem l’expressió lang:lisp xml) i es poden utilitzar expressions regulars. Google code suporta algunes expressions regulars de Perl però està basat en la sintaxi POSIX, molt similar al que es fa servir en openoffice. Per donar fe que la cerca és eficient, prendrem un exemple anterior, el dels colors RGB: \”#([af]|[AF]|[09]{3}([af]|[AF]|[09]{3}\”
26
27
APÈNDIX
Taula comparativa d’expressions OOWriter i Word
Captures MS Word Openoffice Writer
Mails
Llista (1 i 2) (\>)*(\<) (>.[^@]+<) Nom (3 i 4) . (*) (\<)(*)(\>) , (.[^@]+)(<.+>) Cat 5 <(*\@)(*)(*.)> (.*[^@])([.*\.]{1})([.*\.]{0,1})
Dates
Senzill (6 i 7) ([0‐9]{1;2})/([0‐9]{1;2})/([0‐9]{2;4})
([0‐9]{1,2})/([0‐9]{1,2})/ ([0‐9]{2,4}) Complex (8)
+hora (9 i 10) ([0‐9]{1;2}){2;4})([0‐9]
‐([0‐9]{1;2})‐([0‐9] {2}):([0‐9]{2})
([0‐9]{1,2})‐([0{2,4})([0‐9]{2})
‐9]{1,2})‐([0‐9] :([0‐9]{2})
Repeticions Paraules (11) <(*)> <\1> \<([^ ]+)[ ]+\1 Paràgrafs (12 i 13) (*^13)@\1 ?
Subíndex i superíndex
Subíndex (14, 15, 16) ([A‐Za‐z])([0‐9]@)([!0‐9])
\<([A-Za-z]{1,4})([0-9]{1,2})([A-Za-z]{0,4})([0-9]{0,2})([A-Za-z]{0,4})([0-9]{0,2})
Superíndex (17 i 18) ([A‐Za‐z])([0‐9]@)([!0‐9])
\<([A-Za-z]{1,4})([0-9]{1,2})([A-Za-z]{0,4})([0-9]{0,2})([A-Za-z]{0,4})([0-9]{0,2})
Xats
Msn (19 i 20) (\[[0‐9]{2}:[0‐9]{2}:[(àlies:)
0‐9]{2}\]) (\[[0‐9]{2}:[0‐9]{2}:[0‐9]{2}\]) (àlies:)
Xat (21) ([0‐9]{2}:[0‐9]{2})*: ([0‐9]{2}:[0‐9]{2}) .*:
Ips i colors
Ips (22) ([0‐9]{2;3}).([0‐9]{2;3}).([0‐9]{2;3}).([0‐9]{2;3})
(([0‐1]?[0‐9]{1,2}\.)|(2[0‐4][0‐
) 9]\.)|(25[0‐5]\.)){3}(([0‐1]?[0‐9]{1,2})|(2[0‐4][0‐9])|(25[0‐5])
RGB (23) #([a‐fA‐F0‐9]){3}([a‐fA‐F0‐9]){3} #([a‐f]|[A‐F]|[0‐9]){3}([a‐f]|[A‐F]|[0‐9]){3}
Correus
Codi postal (24) INVIABLE \<([1‐9]{2}|[0‐9]|[1‐9]|[1‐9][0‐
9])[0‐9]{3}\>
Mails (25) <(*\@)(*)(*.)>
“\<[:alnum:]*([\.|_|‐|]{0,1})[:alnum:] *([\.|_|‐|]{0,1})[:alnum:]*@ ([:alnum:]*[‐|_|\.]{0,3}[:alnum:]*[‐|_|\.]{0,2}[:alnum:]{2,3})\>
Xifres romanes
XXVI (26) INVIABLE \<(I{0,3}X{0,3})\>|({X{0,3}I[0,3}V{0,3}I{0,3})\>