Expressió regular

De Viquipèdia
Dreceres ràpides: navegació, cerca

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 | modifica el codi]

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 | modifica el codi]

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)+ := 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 := ab a l'inici de frase
    $ al final
    ab$ := 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 /

Sequències d'escapament[modifica | modifica el codi]

\n 
Salt de línia
\t 
Tabulador horitzontal
\r 
Salt de carro
\f 
Salt de pàgina
\v 
Tabulador vertical
\s 
espaiat: [ \n\t\r\f\v]

Classes POSIX[modifica | modifica el codi]

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 localització (LOCALE) actual
[:alpha:]
caràcters alfabètics segons localització (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 localització (LOCALE) actual
[:lower:]
minúscules segons localització (LOCALE) actual
[:cntrl:]
Caràcters de control

Voracitat: minimitzar repeticions[modifica | modifica el codi]

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.

Particularitats del llenguatge Perl[modifica | modifica el codi]

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-Z_]
\W
[^a-zA-Z_]
\b
límit de paraula
\B
no límit de paraula
\A
inici de text, similar a ^ però independent de modificador multilínia
\z
fi de text, similar a $ però independent de modificador multilínia
\Z
fi de text o abans de fi de línia al final (independent de modificador multilí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)

Modificadors Perl[modifica | modifica el codi]

i
insensible a caixa (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'ignoraràn els espais que no estiguin precedits d'escapament o no estiguin en una classe (entre claus rectangulars [])
g
global: cerca múltiple.

Activació de modificadors Perl[modifica | modifica el codi]

(?i)
activa el modificador i
(?-i)
desactiva el modificador i
(?i-sm)
activa l'i i desactiva els s i m
(?i-sm:regexp)
activa l'i i desactiva els s i m només en aplicar regexp

Assercions Perl[modifica | modifica el codi]

(?=regexp)
mira-endavant positiu: comprova, sense avançar, que els caràcters següents corresponguin a regexp
(?!regexp)
mira-endavant negatiu: ... que els caràcters següents NO corresponguin a regexp
(?<=regexp)
mira-enrere positiu: ... que els caràcters anteriors corresponguin a regexp
(?<!regexp)
mira-enrere negatiu: ... que els caràcters anteriors NO corresponguin a regexp

Condicionals Perl[modifica | modifica el codi]

(? regexp1 regexp_cas_de_sí | regexp_cas_de_no)
segons l'èxit del primer patró comprova el que correspongui
(?(1) regexp_cas_de_sí | regexp_cas_de_no)
Si el grup 1 és reconegut ...

Bateig: subexpressions amb nom Perl[modifica | modifica el codi]

(?<nom>regexp) o bé (?'nom'regexp) o bé (?P<nom>regexp)
assigna un nom a la subexpressió regular i l'aplica
(?P>nom)
aplica la subexpressió definida prèviament per nom (estalvia la repetició d'expressions regulars)

Coincidència amb encaix anterior (backreference) Perl[modifica | modifica el codi]

Vegeu [1]

\1, \2, \3
coincidència amb l'encaix del grup esmentat
\g1, \g{-1}
igual, el nombre pot ser negatiu (entre claus) indicant posició relativa (-1 és el grup precedent).[2]

Coincidència amb encaix de subexpressió batejada (Named backreference) Perl[modifica | modifica el codi]

\k<nom>
coincidència amb l'encaix precedent de la subexpr. anomenada "nom".
\g{nom}
igual.
(?P=nom)
igual (sintaxi Python).

Recursiu, Comentari (Perl)[modifica | modifica el codi]

(?R)
recursiu, aplicar el patró complet recursivament en aquest punt
(?#comentari)
comentari en un patró. Sense efecte.

Grup sense captura de text (Perl)[modifica | modifica el codi]

(?:regexp)
grup sense captura de text (no compta en la numeració dels grups encaixats)

Particularitats del llenguatge Java[modifica | modifica el codi]

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 regexString = "\\s"; // expressió regular \s

Particularitats del llenguatge PHP[modifica | modifica el codi]

  • 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 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;

Eines amb suport per a expressions regulars[modifica | modifica el codi]

regexxer
Cerques i substitucions en un arbre de directoris.[3]
egrep (grep -E)
filtre per a consola de línia d'ordres. Doc. a UNIX.[4] Per a Windows amb GNU/Win32 [5]

Referències[modifica | modifica el codi]

  1. Doc. perlre - Perl regular expressions
  2. http://perldoc.perl.org/perlre.html#Capture-groups Exemple de referència relativa
  3. SourceForge.net - regexxer (anglès)
  4. comanda egrep(anglès)
  5. GNU/Win32 - paquet comanda grep(anglès)

Enllaços externs[modifica | modifica el codi]

especificacions[modifica | modifica el codi]

segons llenguatge[modifica | modifica el codi]

altres infos[modifica | modifica el codi]