Regex (expressions regulars)

Què és una regex? Guia d’expressions regulars amb sintaxi bàsica, exemples en Python i JavaScript, errors habituals i bones pràctiques per validar, cercar i extreure text.

« Back to Glossary Index

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.

Vegeu també

« Back to Glossary Index