Un'espressione regolare (abbreviata Regex/RegExp) è un linguaggio di pattern di testo che utilizza una singola stringa per descrivere e far corrispondere una serie di stringhe che soddisfano determinate regole sintattiche. La sua storia risale agli anni '50, quando il neurologo Warren McCulloch e il matematico Walter Pitts proposero un modello matematico di neuroni; più tardi, il matematico Stephen Kleene propose nel 1956 una descrizione algebrica degli「insiemi regolari」basata su di esso. Ken Thompson, padre di Unix, implementò per la prima volta le espressioni regolari nell'editor QED alla fine degli anni '60, e da allora le espressioni regolari sono diventate una funzionalità centrale della toolchain Unix (grep, sed, awk, vi).
Nei linguaggi di programmazione moderni, le espressioni regolari sono quasi una funzionalità standard — RegExp di JavaScript, il modulo re di Python, java.util.regex di Java, la classe Regex di .NET, il pacchetto regexp di Go forniscono supporto regex. Le espressioni regolari sono ampiamente utilizzate nella validazione di moduli (e-mail/telefono/carta d'identità), ricerca e sostituzione di testo (trova e sostituisci negli editor), analisi di log (estrarre log ERROR), web crawling (estrazione di contenuto HTML), pulizia dei dati (ETL), corrispondenza di route, filtraggio dell'input e protezione della sicurezza (regole WAF) e altri scenari.
I concetti centrali delle espressioni regolari includono: classi di caratteri (\d cifre, \w caratteri di parola, \s spazi bianchi), quantificatori (* zero o più, + uno o più, ? zero o uno, {n,m} numero specificato), ancore (^ inizio, $ fine, \b confine di parola), gruppi ((...) gruppo di acquisizione, (?:...) gruppo senza acquisizione, (?<name>...) gruppo nominato), alternanza (|), insiemi di caratteri ([a-z]), lookaround ((?=...) lookahead positivo, (?!) lookahead negativo) ecc. Padroneggiare regex può aumentare notevolmente l'efficienza dell'elaborazione del testo, ma devi anche fare attenzione ad evitare trappole di prestazioni come il ReDoS.