Cos'è un'espressione regolare? Una spiegazione completa
Risposta rapida
Un'espressione regolare è un modello che descrive un insieme di stringhe. Utilizza caratteri letterali (corrispondono a se stessi) e metacaratteri (*, +, ?, ., ^, $, [], (), {}, |, \) con significati speciali. Regex viene utilizzato per la convalida, la ricerca, l'estrazione e la sostituzione. Utilizza il nostro Regex Tester gratuito per testare i modelli rispetto al testo nel tuo browser.
Introduzione
Un'espressione regolare (regex o regexp) è una sequenza di caratteri che definisce un modello di ricerca. Il modello viene utilizzato dagli algoritmi di ricerca di stringhe per trovare, abbinare o sostituire il testo. Le espressioni regolari hanno avuto origine nella teoria del linguaggio formale negli anni '50 (Stephen Kleene) e sono state adottate negli strumenti di testo Unix (grep, sed, awk) negli anni '70. Oggi, le espressioni regolari sono integrate praticamente in ogni linguaggio di programmazione ed editor di testo. Regex è potente: può convalidare formati di posta elettronica, estrarre dati dai log e trovare modelli complessi, ma la sintassi è densa e notoriamente difficile da leggere.
Passo dopo passo
-
Comprendere i caratteri letterali e i metacaratteri
I caratteri letterali (a, b, 1, @) corrispondono a se stessi. I metacaratteri hanno significati speciali: . corrisponde a qualsiasi carattere, * significa zero o più, + significa uno o più, ? significa zero o uno, ^ inizia la corrispondenza, $ termina la corrispondenza.
-
Impara le classi dei personaggi
Le parentesi quadre [] definiscono una classe di caratteri: [aeiou] corrisponde a qualsiasi vocale, [0-9] corrisponde a qualsiasi cifra, [^0-9] corrisponde a qualsiasi non cifra. Classi abbreviate: \d (cifra), \w (carattere di parola), \s (spazi bianchi) e le loro negazioni maiuscole.
-
Utilizzare quantificatori
I quantificatori specificano quante volte un pattern si ripete: * (0+), + (1+), ? (0 o 1), {n} (esattamente n), {n,} (n+), {n,m} (da n a m). Avido per impostazione predefinita; aggiungere ? per la corrispondenza pigra (ad esempio, *?).
-
Gruppo e ancoraggio
Le parentesi () creano gruppi di acquisizione. Alternanza | corrisponde a entrambi i lati (gatto|cane). Le ancore ^ e $ corrispondono all'inizio e alla fine della stringa. Usali per costruire modelli complessi da quelli più semplici.
Esempi
Abbina uno schema simile a un'e-mail
Ingresso: Pattern: [a-z]+@[a-z]+\.[a-z]+
Produzione: Corrispondenze: [email protected], [email protected]
Corrisponde al formato del numero di telefono
Ingresso: Pattern: \d{3}-\d{3}-\d{4}
Produzione: Matches: 555-123-4567
Estrai coppie chiave-valore
Ingresso: Pattern: (\w+)=(\w+)
Produzione: Matches 'key=value' with group 1 as key, group 2 as value
Problemi comuni
- L'abbinamento avido consuma eccessivamente —.* corrisponde il più possibile. Utilizzo .*? per la corrispondenza pigra per trovare la corrispondenza più breve.
- Dimenticare l'escape dei caratteri speciali —., *, +, ?, ecc. sono speciali. Utilizzare \ per abbinarli letteralmente (ad esempio, \. corrisponde a un punto letterale).
- Backtracking catastrofico: i modelli con quantificatori annidati (ad esempio, (a+)+) possono richiedere un tempo esponenziale su determinati input, causando attacchi ReDoS.
- Corrispondenza eccessiva: senza ancore (^ e $), un modello corrisponde ovunque. Utilizzare ^...$ per trovare la corrispondenza con l'intera stringa.
Suggerimenti
- Inizia in modo semplice e aggiungi la complessità in modo incrementale: eseguire il debug di una regex complessa tutta in una volta è molto difficile.
- Utilizza un tester regex per sperimentare modelli rispetto a testo di esempio: visualizza le corrispondenze evidenziate in tempo reale.
- Commenta le espressioni regolari complesse utilizzando la modalità estesa (flag /x in alcuni motori) o suddividile in parti con nome.
- Utilizza il nostro Regex Tester per testare istantaneamente i pattern nel tuo browser: nessuna registrazione, completamente privato.