Un llenguatge compacte per descriure patrons de text i fer-hi cerca, validació o extracció.
Definició
Una regex (o expressió regular) és una seqüència de símbols que descriu un patró de text. S’utilitza per trobar, validar, substituir o extreure fragments dins de cadenes en multitud de llenguatges (p. ex., Python, JavaScript, R, Java, PHP).
Per què és útil
- Validació: correus, telèfons, codis postals.
- Neteja de dades: normalitzar formats, eliminar soroll.
- Extracció: captar grups rellevants (dates, imports, etiquetes).
- Substitució massiva: refactors de codi, reescriptura de logs.
Sintaxi bàsica
.
qualsevol caràcter (excepte salt de línia per defecte)\d
dígit;\w
caràcter de paraula;\s
espai en blanc- Quantificadors:
*
0+,+
1+,?
0 o 1,{m,n}
rang - Àncores:
^
inici,$
final - Classes:
[abc]
qualsevol d’aquests;[^abc]
qualsevol excepte - Grups:
(...)
capturant;(?:...)
no capturant;(?<nom>...)
amb nom - Alternança:
a|b
- Flags: p. ex.
i
(case-insensitive),m
(multilínia),g
(global, JS),s
(dotall)
Exemples
Python
import re
text = "Contacta: hello@example.com i sales@shop.co"
pattern = r"[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}"
# Trobar totes les coincidències
emails = re.findall(pattern, text)
print(emails) # ['hello@example.com', 'sales@shop.co']
# Capturar grups amb nom (usuari i domini)
m = re.search(r"(?<user>[A-Za-z0-9._%+-]+)@(?<domain>[A-Za-z0-9.-]+\.[A-Za-z]{2,})", text)
if m:
print(m.group("user"), m.group("domain"))
# Substitució
anon = re.sub(pattern, "[email]", text)
print(anon)
JavaScript
const text = "SKU: AB-12345 i AB-98765";
const re = /\bAB-(\d{5})\b/g;
const ids = [...text.matchAll(re)].map(m => m[1]);
console.log(ids); // ["12345","98765"]
// Validació bàsica de data (YYYY-MM)
const isYearMonth = /^\d{4}-(0[1-9]|1[0-2])$/.test("2025-10");
console.log(isYearMonth); // true
Errors habituals i bones pràctiques
- Gourmandesa:
.*
és golafre; usa quantificadors “mandrosos”.*?
quan calgui. - Escapat: recorda escapar meta-caràcters (
.
,+
,?
,(
,)
,[
,]
,{
,}
,^
,$
,|
,\
). - Legibilitat: per a patrons llargs, comenta’ls (flags com
re.VERBOSE
a Python) o trenca’ls en parts. - Rendiment: evita patrons amb backtracking explosiu; prefereix classes i àncores clares.
- Internacionalització: per a lletres amb accents o Unicode, activa modes/llibreries que ho respectin.