Expressió regular
En informàtica, una expressió regular (o col·loquialment anomenades regexp, acrònim de l'anglès regular expression) és una representació, segons unes regles sintàctiques d'un llenguatge formal, d'una porció de text genèric a buscar dins d'un altre text, com per exemple uns caràcters, paraules o patrons de text concrets.
El text genèric de l'expressió regular pot representar patrons (en anglès patterns) amb determinats caràcters que tenen un significat especial (per exemple, en el cas del shell d'unix, el caràcter comodí "?" per representar un caràcter qualsevol, el caràcter comodí "*" per representar un nombre qualsevol de caràcters, o classes com "[abc]" per representar qualsevol dels caràcters 'a', 'b' o 'c').
Una expressió regular està escrita seguint les regles d'un llenguatge formal, que poden ser interpretades per un programa processador d'expressions regulars, capaç d'examinar un text i reconèixer-hi les parts que es corresponen (en anglès match) amb l'expressió regular especificada.
Molts processadors de textos i llenguatges de programació fan ús de les seves pròpies expressions regulars per a procediments de cerca o bé de cerca i substitució de textos.
Expressions regulars unix
[modifica]Actualment quan parlem d'expressions regulars solem referir-nos a la sintaxi introduïda per Ken Thompson en el món unix en eines com ara sed, awk i grep, que posteriorment ha estat ampliada per POSIX i encara més per perl en el seu propi món.
Una expressió regular fa ús de caràcters que tenen un significat especial, anomenats metacaràcters. Aquest significat especial es pot obviar precedint el caràcter en qüestió amb el caràcter barra invertida \ (ascii 92).
Qualsevol caràcter literal o un caràcter especial precedit per una barra invertida \ constitueixen els termes del vocabulari.
Construccions bàsiques
[modifica]- Seqüència
- (simple juxtaposició de caràcters) ab := 'a' seguit de 'b'
- Alternativa
- a|b := designa qualsevol de les frases 'a' o 'b', indiferentment
- Agrupació, grup afectat per un quantificador ()
- (ab) := designa ab, abab, ababab, abababab, ...
- Quantificadors (es poden referir al caràcter o al grup precedent)
- ? designa una part opcional
- ab? := designa les frases a, ab
- designa una part repetible (una o més)
- ab := designa ab, abb, abbb, abbbb, ...
- * designa una part repetible opcional (zero o més)
- ab* := designa a, ab, abb, abbb, ...
- {nombre mínim, nombre màxim} designa una part repetible amb un mínim i un màxim de repeticions
- ab{2,3} := designa abb i abbb
- {nombre} designa una part repetible amb un nombre exacte de repeticions
- ab{2} := designa abb
- {nombre mínim,} designa una part repetible amb un mínim de repeticions
- ab{2,} := designa abb, abbb, abbbb, ...
- Àncores
- ^ a l'inici
- ^ab := designa ab a l'inici de frase
- $ al final
- ab$ := designa ab a final de frase
- Classes de caràcters
- . (tot sol) designa habitualment tot l'alfabet
- el punt indica qualsevol caràcter en una línia (exceptuant salt de línia, excepció anul·lable amb #Modificadors Perl)
- [abc] designa un caràcter del conjunt especificat
- [abc] := designa les frases d'un sol caràcter a, b, c
- [a-z] el guionet designa un caràcter en un rang
- [a-z] := designa les frases d'un sol caràcter alfabètic anglosaxó en minúscula
- [a-zA-Z] (juxtaposició dins la classe) designa la Unió de classes
- [a-zA-Z] := [a-z] | [A-Z]
- [^abc] (^ a l'inici de la classe) designa la classe complementària (negada)
- [^abc] := qualsevol caràcter excepte [abc]
- \ facilita la designació del caràcter següent com a literal anul·lant la funció modificadora que pugui tenir en el llenguatge d'exp. regulars (signe d'escapament)
- \(:= '('
- En programes que permeten manipulació del text trobat (per exemple amb programes sed o awk, no pas grep, però sí egrep):
- Referències als grups de text (entre parèntesis) excepte cas especial, segons ordre, \1 \2 .. \9
- <([a-z][a-z0-9]*)[^>]*>([^<]*)</\1> := reconeix un etiquetat XML amb etiqueta de tancament igual a la d'inici, noteu \1 després de /
Seqüències d'escapament
[modifica]- \n
- Salt de línia
- \t
- Tabulador horitzontal
- \r
- Salt de carro (terminologia heretada de les màquines d'escriure)
- \f
- Salt de pàgina
- \v
- Tabulador vertical
- \s
- espaiat: [ \n\t\r\f\v]
Classes per fer servir dins una expressió entre claus [ ]:
- símbols multi-caràcter en una classe [. .]
- [a-c[.ch.]d-z] := inclou la ch castellana en una classe alfabet
- classe de caràcters equivalents en l'ordenació local [= =]
- d [ [=e=] ] u és el mateix que d[eéè]u
- [:digit:]
- [[:digit:]] equival a [0-9]
- [:alnum:]
- caràcters alfanumèrics segons personalització local (LOCALE) actual
- [:alpha:]
- caràcters alfabètics segons personalització local (LOCALE) actual
- [:blank:]
- espai, tabulador
- [:xdigit:]
- [0-9A-Fa-f]
- [:punct:]
- Símbols de puntuació ., " ' ? !; :
- [:print:]
- Qualsevol caràcter imprimible
- [:space:]
- [ \t\r\n\v\f].
- [:graph:]
- caràcters gràfics (visibles): exclou [:space:].
- [:upper:]
- majúscules segons personalització local (LOCALE) actual
- [:lower:]
- minúscules segons personalització local (LOCALE) actual
- [:cntrl:]
- Caràcters de control
Voracitat: minimitzar repeticions
[modifica]El signe ? després dels quantificadors ? * indica que el patró s'ha de satisfer amb el menor nombre de repeticions possible (comportament mandrós, de l'anglès lazy), en comptes del comportament habitual contrari (cobejós o voraç, en anglès greedy).
Per exemple, si es busca l'expressió regular "g.*os" al text "el gos busca un os", el comportament per defecte del processador és retornar la porció de text més llarga possible que es correspon amb l'expressió buscada, que en aquest cas el resultat seria "gos busca un os", amb el tipus de comportament que anomenem "voraç" o greedy.
En canvi buscant l'expressió regular "g.*?os" al mateix text, el processador retornarà la porció de text més curta possible que es correspon amb l'expressió buscada, i en aquest cas el resultat seria "gos", amb el tipus de comportament que anomenem "mandrós" o lazy.
El Perl introdueix tot de caràcters especials i operacions pròpies:
- \d
- dígit
- \D
- no dígit
- \s
- espai (qualsevol espaiat: espai tabulador salt de línia)
- \S
- no espai
- \w
- [a-zA-Z0-9_] (alfanumèric o guió baix)
- \W
- [^a-zA-Z0-9_]
- \b
- límit de paraula
- \B
- no límit de paraula
- \A
- inici de text, independent de modificador multi-línia
- \z
- fi de text, independent de modificador multi-línia
- \Z
- fi de text opcionalment precedit d'un sol fi de línia (independent de modificador multi-línia)
- \G
- quan hi ha múltiples ocurrències en el text, inici de text a partir del final de l'ocurrència anterior (només en cerques múltiples)
- i
- insensible a majúscules i minúscules (afecta majúscules i minúscules indistintament)
- m
- multilínia: normalment els símbols ^ i $ designen l'inici de text i fi de text encara que hi hagi salts de línia. Amb aquest modificador ^ es reconeixerà a tots els inicis de línia i $ a tots els finals de línia.
- s
- punt-tot: normalment el punt reconeix qualsevol caràcter excepte un salt de línia. Amb aquest modificador reconeixerà també els salts de línia.
- x
- estès: amb aquest modificador s'ignoraran els espais que no estiguin precedits d'escapament o no estiguin en una classe (entre claus rectangulars [])
- g
- global: cerca múltiple.
- (?i)
- activa el modificador i
- (?-i)
- desactiva el modificador i
- (?i-sm)
- activa l'i i desactiva els s i m
- (?i-sm:patró)
- activa l'i i desactiva els s i m només en aplicar patró
- prefix "(?=" com a (?=patró)
- mira-endavant positiu: comprova, sense avançar, que els caràcters següents corresponguin al patró
- prefix "(?!" com a (?!patró)
- mira-endavant negatiu: ... que els caràcters següents NO corresponguin al patró
- prefix "(?<=" com a (?<=patró)
- mira-enrere positiu: ... que els caràcters anteriors corresponguin al patró
- prefix "(?<!" com a (?<!patró)
- mira-enrere negatiu: ... que els caràcters anteriors NO corresponguin al patró
- (? patróProva patró_cas_de_sí | patró_cas_de_no)
- segons l'èxit del patróProva comprova el que correspongui
- (?(1) patró_cas_de_sí | patró_cas_de_no)
- Si el grup indicat és reconegut ...
- (?<nom>patró) o bé (?'nom'patró) o bé (?P<nom>patró)
- assigna un nom al patró d'expressió regular i l'aplica
- (?P>nom)
- aplica l'expressió regular definida prèviament per nom
Vegeu[1]
- \1, \2, \3
- coincidència amb l'encaix del grup indicat
- \g1, \g{-1}
- igual, el nombre pot ser negatiu (entre claus) indicant posició relativa ({-1} és el grup precedent).[2]
- \k<nom>
- coincidència amb l'encaix precedent de la subexpr. anomenada "nom".
- \g{nom}
- igual.
- (?P=nom)
- igual (sintaxi Python).
- (?R)
- recursiu, aplicar el patró complet recursivament en aquest punt
- prefix "(?#" com a (?#comentari)
- comentari en un patró. Sense efecte.
- prefix "(?:" com a (?:patró)
- grup sense captura de text (no compta en la numeració dels grups encaixats)
Particularitats del llenguatge Java
[modifica]En escriure una expressió regular en una cadena literal Java cal doblar les barres inverses, ja que interpreta la barra inversa com un signe d'escapament.
String strRegex = "\\s"; // expressió regular \s
Particularitats del llenguatge PHP
[modifica]- Si la cadena està delimitada per dobles cometes o és dins un heredoc (document tot seguit) la barra inversa s'interpreta com el signe d'escapament i cal doblarles
- Si la cadena està delimitada per cometes senzilles (apòstrofs), no es processa el contingut de la cadena i no cal doblar les barres inverses
Les següents expressions són equivalents
$regexp1 = "\\s" ; $regexp2 = '\s' ;
aquest document tot seguit (en anglès tècnic heredoc) també
$regexp3 = <<<EOD \\s EOD;
en un nowdoc de PHP[3] similar al heredoc però sense processar, com les cadenes entre cometes senzilles:
$regexp4 = <<<'EOD' \s EOD;
Eines amb suport per a expressions regulars
[modifica]- regexxer
- Cerques i substitucions en un arbre de directoris.[4]
- egrep (grep -E)
- filtre per a consola de línia d'ordres. Doc. a UNIX.[5] Per a Windows amb GNU/Win32[6]
Especificacions POSIX
[modifica]- Expressions regulars Unix/POSIX - 1997 (anglès) The Single UNIX ® Specification, Version 2. The Open Group
- Expressions regulars Unix/POSIX - 2004 (anglès) The Open Group Base Specifications Issue 6, IEEE Std 1003.1, 2004 Edition. The Open Group. 2004
Especificacions PERL
[modifica]- biblio. libpcre (anglès) (Univ. de Cambridge)
- Sintaxi d'expressions regulars a CPAN, l'arxiu de Perl (anglès)
Suport segons llenguatge
[modifica]- Expressions regulars del Perl (anglès)
- Expressions regulars en PHP (anglès)
- Expressions regulars en Java (anglès)
- Expressions regulars en Javascript de Mozilla Arxivat 2007-08-23 a Wayback Machine. (anglès)
- Expressions regulars en Python (anglès)
- Expressions regulars en .NET (anglès)
- Expressions regulars en Jscript de Microsoft (anglès)
Referències
[modifica]- ↑ Doc. perlre - Perl regular expressions
- ↑ http://perldoc.perl.org/perlre.html#Capture-groups Exemple de referència relativa
- ↑ NowDoc de PHP(anglès)
- ↑ SourceForge.net - regexxer (anglès)
- ↑ comanda egrep Arxivat 2011-05-18 a Wayback Machine.(anglès)
- ↑ GNU/Win32 - paquet comanda grep(anglès)
Enllaços externs
[modifica]- Wiki PatternsTutorial
- Taules de comparació Acceptació de signes i produccions entre diversos llenguatges d'expressions regulars.
- Info d'expressions regulars (anglès)