13-01-2023
Introducció
Les expressions regulars són una eina per a processar i analitzar text. Consisteixen en una seqüència de caràcters que coincideixen amb un patró regular.
Les expressions regulars són complexes de fer servir, ja que no són gaire llegibles; però, alhora, són potentíssimes, com satiritza la següent vinyeta de XKCD:
El format de les expressions regulars POSIX, el més estès, és el següent:
/regex/modifiers
Les barres (/
) són el delimitador de l’expressió regular, no en formen part. Es pot fer servir algun altre caràcter,
com #
. Si es vol fer una coincidència del delimitador dins de l’expressió regular, cal escapar el caràcter.
En aquest post veurem les parts bàsiques que formen part de les expressions regulars. A més proposarem uns exercicis per a practicar i familiaritzar-nos amb el seu ús.
Components de les expressions regulars
Àncores
^
: coincideix amb l’inici de la línia o el text.$
: coincideix amb el final de la línia o el text.
Context per defecte
En el context per defecte, hi ha una i
(and
) implícita entre els seus elements.
.
: coincideix amb qualsevol caràcter.\d
: coincideix amb qualsevol dígit.\D
: coincideix amb qualsevol no dígit.\s
: coincideix amb qualsevol caràcter d’espai en blanc (␣
,\t
,\r
,\n
).\S
: coincideix amb qualsevol caràcter que no sigui d’espai en blanc (␣
,\t
,\r
,\n
).\w
: coincideix amb qualsevol caràcter o caràcters que sigui una paraula.\W
: coincideix amb qualsevol caràcter o caràcters que no sigui una paraula.\
: fa literal qualsevol caràcter.-
: coincideix amb un guió.
Classes de caràcters []
Les classes de caràcters es construeixen amb claudàtors ([]
). Hi ha una o
(or
) implícita entre els seus elements.
[^...]
: classe de caràcters negada: coincideix amb un caràcter no llistat a la classe.[a-z]
: coincideix amb un caràcter en el rang a-z.[^a-z]
: coincideix amb un caràcter no present en el rang a-z.[0-9]
: coincideix amb un caràcter en el rang 0-9.[^0-9]
: coincideix amb un caràcter no present en el rang 0-9.-
: al principi o final d’una classe de caràcters, coincideix amb un guió literal; en qualsevol altra posició, serveix per a construir rangs.
Constructors de grup ()
Els constructors de grup es construeixen amb parèntesis (()
). Hi ha una i
(and
) implícita entre els seus
elements.
(a|b)
: coincideix amba
ob
. És equivalent a[ab]
.(?:...)
: grup no capturant.(?'name'...)
: grup de captura amb nom(?=...)
: positive lookahead, mira coincidències endavant del grup, sense consumir caràcters.(?!...)
: negative lookahead, mira coincidències negatives endavant del grup, sense consumir caràcters.(?<=...)
: positive lookbehind, mira coincidències enrere del grup, sense consumir caràcters.(?<!...)
: negative lookbehind, mira coincidències negatives enrere del grup, sense consumir caràcters.
Quantificadors
Afecten el caràcter, classe o grup previ.
a?
: 0 o 1 coincidències de a.a*
: 0 o més coincidències de a, sense límit.a+
: 1 o més coincidències de a, sense límit.a{3}
: exactament 3 coincidències de a.a{3,}
: 3 o més coincidències de a, sense límit.a{3,7}
: entre 3 i 7 coincidències de a.
Modificadors
Afecten el comportament de tota l’expressió regular.
g
: evita que el motor d’expressions regulars acabi l’anàlisi després de la primera coincidència.m
: les àncores^
i$
coincideixen amb el principi i el final de cada línia, no amb el principi i el final del text.i
: fa les coincidències independents de majúscules i minúscules.x
: fa que el motor ignori tots els espais en blanc, i permet tenir comentaris començant per#
.
Exercicis
Es pot fer servir l’eina Regex101 per a verificar les respostes.
Exercici 1
Coincidir els espais en blanc al final d’una línia.
Text a analitzar:
dos_espais_en_blanc_al_final
un_espai_en_blanc_al_final
Coincidències:
- Línia 1:
[␣␣]
- Línia 2:
[␣]
Exercici 2
Coincideix el número i guió del principi de cadascuna de les línies.
Text a analitzar:
1.company.user.2022
2.company.videos.2022
10.company.categories.2022
20-company.lists.2022
Coincidències:
- Línia 1:
1.
- Línia 2:
2.
- Línia 3:
10.
- Línia 4: no coincideix
Exercici 3
Coincideix una data en el format dd/mm/yyyy
o dd/mm/yy
dins d’un text. La data pot estar a qualsevol posició. No cal
validar que la data sigui correcta. Pista: fer servir constructors de grup.
Text a analitzar:
Avui és 01/01/2022.
Demà será 02/01/22, segon dia de l'any.
Coincidències (fent servir grups):
- Línia 1:
dia: 01, mes: 01, any: 2022
- Línia 2:
dia: 01, mes: 01, any: 22
Exercici 4
Coincideix un URI de la forma /productes/{categoria}/{subcategoria}/
. El text entre claus ({}
) és opcional. La barra
del final, també. L’URI només pot contenir lletres en minúscula, números i barres.
Text a analitzar:
/productes/
/productes/categoria-1/
/productes/categoria-1/subcategoria-1/
/productes/categoria-2
/productes/categoria-2/subcategoria-3
Coincidències
- Línia 1:
/productes/
- Línia 2:
/productes/categoria-1/
- Línia 3:
/productes/categoria-1/subcategoria-1/
- Línia 4:
/productes/categoria-2
- Línia 5:
/productes/categoria-2/subcategoria-3
Exercici 5
Coincideix un URI de la forma /productes/{categoria}/
, que no coincideix amb un URI de la
forma /productes/favorits/
. El text entre claus ({}
) és opcional. La barra del final, també. L’URI només pot
contenir lletres en minúscula, números i barres.
Text a analitzar:
/productes/
/productes/categoria-1/
/productes/categoria-2
/productes/favorits/
Coincidències:
- Línia 1:
/productes/
- Línia 2:
/productes/categoria-1/
- Línia 3:
/productes/categoria-2
- Línia 4: no coincideix.
Exercici 6
Coincideix la part prèvia a http://
o https://
dels URL següents.
Text a analitzar:
/local/url/path/http://www.example.com/path/
/local/url/path/https://www.example.com/path/
/local/url/path/ftp://ftp.example.com/path/
Coincidències:
- Línia 1:
/local/url/path/
- Línia 2:
/local/url/path/
- Línia 3: no coincideix.
Referències
- Mastering regular expressions, de Jeffrey Friedl
- Writing better regular expressions in PHP
- Autoregex: Effortless conversions from English <-> Regex
- Regexr: RegExr is an online tool to learn, build, & test Regular Expressions (RegEx / RegExp).
- iHateRegex.