Vés al contingut

Expressió regular

De la Viquipèdia, l'enciclopèdia lliure

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 POSIX

[modifica]

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.

Particularitats del llenguatge Perl

[modifica]

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)

Modificadors Perl

[modifica]
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.

Activació de modificadors Perl

[modifica]
(?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ó

Assercions Perl

[modifica]
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ó

Condicionals Perl

[modifica]
(? 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 ...

Bateig: subexpressions amb nom Perl

[modifica]
(?<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

Coincidència amb encaix anterior (ang: backreference) Perl

[modifica]

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]

Coincidència amb encaix de subexpressió batejada (Named backreference) Perl

[modifica]
\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]
(?R)
recursiu, aplicar el patró complet recursivament en aquest punt
prefix "(?#" com a (?#comentari)
comentari en un patró. Sense efecte.

Grup sense captura de text (Perl)

[modifica]
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]

Suport segons llenguatge

[modifica]

Referències

[modifica]

Enllaços externs

[modifica]