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.

Taula de continguts

[modifica] Expressions regulars unix

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.

[modifica] Construccions bàsiques

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] (yuxtaposició 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 /

[modifica] Sequències d'escapament

\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]

[modifica] Expressions POSIX

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 la ordenació local [= =]
d [ [=e=] ] u és el mateix que d[eéè]u
[:digit:]
[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

[modifica] Voracitat: minimitzar repeticions

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.

[modifica] Particularitats del llenguatge Perl

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)

[modifica] Modificadors Perl

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.

[modifica] Activació de modificadors Perl

(?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

[modifica] Assercions Perl

(?=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-enrera positiu: ... que els caràcters anteriors corresponguin a regexp
(?<!regexp)
mira-enrera negatiu: ... que els caràcters anteriors NO corresponguin a regexp

[modifica] Condicionals Perl

(? 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 ...

[modifica] Subexpressions amb nom Perl

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

[modifica] Recursiu, Comentari (Perl)

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

[modifica] Grup sense captura de text (Perl)

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

[modifica] Particularitats del llenguatge Java

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

[modifica] Particularitats del llenguatge PHP

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

[modifica] Eines amb suport per a expressions regulars

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

[modifica] Referències

  1. SourceForge.net - regexxer (anglès)
  2. comanda egrep(anglès)
  3. GNU/Win32 - paquet comanda grep(anglès)

[modifica] Enllaços externs

[modifica] segons llenguatge

[modifica] altres infos

Eines personals
Espais de noms
Variants
Accions
Navegació
Comunitat
Imprimeix/exporta
Eines
En altres llengües