Vés al contingut

Comprovació de patrons

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

En tecnologies de la informació, l'encaix o comprovació de patrons (en anglès: pattern matching) és l'operació de comprovar si una dada pot ser descomposta a partir de les operacions especificades en una expressió patró, obtenint-ne els components constitutius i assignant-los a les variables especificades al patró, cas de patrons d'expressions algebraiques o obtingudes com a resultat en cas d'expressions regulars en forma de llista de seccions delimitades per parèntesis.

Els patrons algebraics s'utilitzen molt en llenguatges de programació funcional. Per exemple, si es té una dada cadena 'abc' i el patró és x.'c' (x seguit de 'c') la comprovació tindrà èxit i s'assignarà a la variable x el valor 'ab'. Normalment se sol especificar una llista de patrons possibles i les accions a prendre en cada cas.

Cas de llistes i llenguatge Haskell:

[]           identifica la llista buida
(x:xs)     expressa la composició a partir d'un element i una altra llista

La descomposició per comprovació de patrons es pot completar amb guardes per especificar accions a fer en subdominis de valors.

(x:xs) | x<5 ...
| altrament ...

En llenguatge Scala es pot afegir comprovació de tipus en els patrons

x:String ...
x:Int ...

Els valors individuals també poden ser especificats com a patrons

0 ...
1 ...
n ...

Expressions regulars

[modifica]

Els patrons d'expressions regulars permeten descompondre un text i seleccionar subseqüències marcades entre parèntesis, obtenint com a resultat la llista de frases dites grups corresponents a les zones delimitades, que poden aplicar-se posteriorment a una substitució afegint un patró de substitució amb \1 \n o $1 $n marcant els llocs on incloure els grups obtinguts.

Hi ha llenguatges que incorporen aquests patrons amb tipus propis com ara Javascript

rexp = /a(b?c*)d(e?[a-c]{1,5}g)h/ ;
x = tira.replace(rexp, "..$1..$2..") ;

i els que no ho fan els construeixen a partir de cadenes de text i proporcionen biblioteques de rutines específiques per a aquest propòsit.

rexp = "a(b?c*)d(e?[a-c]{1,5}g)h" ;