Sommario
In questa esercitazione vedremo in dettaglio come utilizzare le regex per abbinare le stringhe in Excel.
Quando si deve trovare un determinato valore in un intervallo di celle, si usa la funzione MATCH o XMATCH. Quando si cerca una stringa specifica in una cella, sono utili le funzioni FIND e SEARCH. E come si fa a sapere se una cella contiene informazioni che corrispondono a un determinato modello? Ovviamente, usando le espressioni regolari. Ma Excel non supporta le regex! Non c'è da preoccuparsi, lo costringeremo a farlo :)
Funzione Regex di Excel VBA per abbinare le stringhe
Come è abbastanza chiaro dall'intestazione, per utilizzare le espressioni regolari in Excel è necessario creare la propria funzione. Fortunatamente, il VBA di Excel ha una funzione incorporata RegExp che si può utilizzare nel codice come mostrato di seguito:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'array per memorizzare i risultati Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indice della riga corrente nell'intervallo di origine, indice della colonna corrente nell'intervallo di origine, conteggio delle righe, conteggio delle colonne On Error GoTo ErrHandlRegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = pattern regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else regex.ignorecase = True End If cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 A cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End FunctionIncollare il codice nell'editor VBA e il nuovo file RegExpMatch Se non si è molto esperti di VBA, può essere utile questa guida: Come inserire codice VBA in Excel.
Nota: dopo aver inserito il codice, ricordarsi di salvare il file come file cartella di lavoro abilitata alle macro (.xlsm).
Sintassi di RegExpMatch
Il RegExpMatch controlla se una qualsiasi parte della stringa sorgente corrisponde a un'espressione regolare. Il risultato è un valore booleano: VERO se viene trovata almeno una corrispondenza, FALSO altrimenti.
La nostra funzione personalizzata ha 3 argomenti: i primi due sono obbligatori e l'ultimo è opzionale:
RegExpMatch(testo, modello, [match_case])Dove:
- Testo (obbligatorio) - una o più stringhe in cui cercare. Può essere fornito come riferimento a una cella o a un intervallo.
- Modello (obbligatorio) - l'espressione regolare a cui abbinare. Se inserito direttamente in una formula, il modello deve essere racchiuso tra doppi apici.
- Caso_di_corrente (opzionale) - definisce il tipo di corrispondenza. Se TRUE o omesso (valore predefinito), viene eseguita una corrispondenza sensibile alle maiuscole e alle minuscole; se FALSE - non sensibile alle maiuscole e alle minuscole.
La funzione funziona in tutte le versioni di Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 e Excel 2010.
3 cose da sapere su RegExpMatch
Prima di passare ai calcoli pratici, si prega di prendere nota dei seguenti punti che chiariscono alcuni aspetti tecnici:
- La funzione può elaborare un file singola cellula o gamma di celle In quest'ultimo caso, i risultati vengono restituiti nelle celle vicine sotto forma di una matrice dinamica, o di un intervallo di spillatura, come mostrato in questo esempio.
- Per impostazione predefinita, la funzione è sensibile alle maiuscole e alle minuscole Per ignorare le maiuscole del testo, impostare il parametro match_case a FALSE. A causa delle limitazioni di VBA Regexp, il modello non sensibile alle maiuscole (?i) non è supportato.
- Se non viene trovato uno schema valido, la funzione restituisce FALSO; se il modello il modello non è valido si verifica un errore #VALORE!
Di seguito sono riportati alcuni esempi di corrispondenza regex creati a scopo dimostrativo. Non possiamo garantire che i nostri modelli funzionino perfettamente con una gamma più ampia di dati di input nei vostri fogli di lavoro reali. Prima di metterli in produzione, assicuratevi di testare e regolare i nostri modelli di esempio in base alle vostre esigenze.
Come usare le regex per abbinare le stringhe in Excel
Quando tutte le stringhe che si vogliono confrontare hanno lo stesso schema, le espressioni regolari sono la soluzione ideale.
Supponiamo di avere un intervallo di celle (A5:A9) contenenti vari dettagli su alcuni articoli. Desideriamo sapere quali celle contengono SKU. Supponendo che ogni SKU sia composto da 2 lettere maiuscole, un trattino e 3 cifre, è possibile abbinarle utilizzando la seguente espressione.
Modello : \b[A-Z]{2}-\d{3}\b
Dove [A-Z]{2} indica 2 lettere maiuscole qualsiasi dalla A alla Z e \d{3} indica 3 cifre qualsiasi da 0 a 9. Il carattere \b indica un confine di parola, ovvero un SKU è una parola separata e non fa parte di una stringa più grande come 23-MAR-2022.
Una volta stabilito lo schema, possiamo passare alla scrittura di una formula. Essenzialmente, l'uso di una funzione personalizzata non è diverso da quello di una funzione nativa. Non appena si inizia a digitare una formula, il nome della funzione appare nell'elenco suggerito dal completamento automatico di Excel. Tuttavia, ci sono un paio di sfumature in Dynamic Array Excel (Microsoft 365 ed Excel 2021) e Excel tradizionale (2019 e versioni precedenti).
Corrisponde alla stringa in una cella
Per abbinare una stringa in una singola cella, fare riferimento a quella cella nel primo argomento. Il secondo argomento deve contenere un'espressione regolare.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Il modello può anche essere conservato in una cella predefinita, bloccata con un riferimento assoluto ($A$2):
=RegExpMatch(A5, $A$2)
Dopo aver inserito la formula nella prima cella, è possibile trascinarla su tutte le altre righe.
Questo metodo funziona perfettamente in tutte le versioni di Excel .
Corrisponde a stringhe in più celle contemporaneamente
Per abbinare più stringhe con una singola formula, includere un riferimento all'intervallo nel primo argomento:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
In Excel 365 e Excel 2021 che supportano gli array dinamici, funziona in questo modo: si digita la formula nella prima cella, si preme Invio e la formula si riversa automaticamente nelle celle successive.
In Excel 2019 e precedenti, funziona solo come una formula di matrice CSE tradizionale, che viene inserita in un intervallo di celle e completata premendo insieme i tasti Ctrl + Maiusc + Invio.
Regex per la corrispondenza con il numero
Per abbinare qualsiasi cifra singola da 0 a 9, utilizzare il comando \d A seconda del compito specifico, aggiungere un quantificatore adeguato o creare uno schema più complesso.
Regex per la corrispondenza con qualsiasi numero
Per trovare un numero di qualsiasi lunghezza, inserire il quantificatore + subito dopo il carattere /d, che indica di cercare i numeri contenenti 1 o più cifre.
Modello : \d+
=RegExpMatch(A5:A9, "\d+")
Regex per la corrispondenza di numeri di lunghezza specifica
Se l'obiettivo è quello di trovare una corrispondenza tra valori numerici contenenti un certo numero di cifre, utilizzare \d insieme a un quantificatore appropriato.
Ad esempio, per abbinare i numeri di fattura composti esattamente da 7 cifre, si usa \d{7}. Tuttavia, si tenga presente che corrisponderà a 7 cifre in qualsiasi punto della stringa, compresi i numeri a 10 o 100 cifre. Se non è questo ciò che si sta cercando, si metta il limite di parola \b su entrambi i lati.
Modello \b\d{7} \b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex per abbinare i numeri di telefono
Poiché i numeri di telefono possono essere scritti in vari formati, la loro corrispondenza richiede un'espressione regolare più sofisticata.
Nel seguente set di dati, cercheremo numeri di 10 cifre che hanno 3 cifre nei primi due gruppi e 4 cifre nell'ultimo gruppo. I gruppi possono essere separati da un punto, un trattino o uno spazio. Il primo gruppo può o meno essere racchiuso tra parentesi.
Modello: (\(\d{3}})
Scomponendo questa espressione regolare, ecco cosa si ottiene:
- La prima parte (\(\d{3}\)
- La parte [-\.\s]? significa 0 o 1 occorrenza di qualsiasi carattere tra parentesi quadre: trattino, punto o spazio bianco.
- Poi, c'è un altro gruppo di 3 cifre d{3} seguito da un trattino, un punto o uno spazio bianco [\-\.\s]? che compare 0 o 1 volta.
- L'ultimo gruppo di 4 cifre \d{4} è seguito da un limite di parola \b per chiarire che un numero di telefono non può far parte di un numero più grande.
Con la stringa originale in A5 e l'espressione regolare in A2, la formula assume questa forma:
=RegExpMatch(A5, $A$2)
... e funziona esattamente come previsto:
Note:
- I codici internazionali non vengono controllati, quindi possono essere presenti o meno.
- Nelle espressioni regolari, \s sta per qualsiasi carattere di spazio bianco come uno spazio, una tabulazione, un ritorno a capo o una nuova riga. Per consentire solo gli spazi, usare [-\. ] invece di [-\.\s].
- [^13] corrisponderà a qualsiasi singolo carattere che non sia 1 o 3.
- [^1-3] corrisponderà a qualsiasi singolo carattere che non sia 1, 2 o 3 (cioè qualsiasi cifra da 1 a 3).
- La regex di cui sopra funziona solo per linea singola Nel caso di stringhe di più righe, i caratteri ^ e $ corrispondono all'inizio e alla fine di ogni riga invece che all'inizio e alla fine della stringa di input, quindi la regex cerca solo nella prima riga.
- Per abbinare le stringhe che non avviare con un determinato testo utilizzare un'espressione regolare come ^(?!limoni).*$
- Per abbinare le stringhe che non terminare con un determinato testo , includere l'ancora della stringa finale nello schema di ricerca: ^((?!limoni$).)*$
- Nome utente può includere lettere, numeri, trattini bassi, punti e trattini. Tenendo presente che \w corrisponde a qualsiasi lettera, cifra o trattino basso, otteniamo la seguente regex: [\w\.\-]+
- Nome del dominio può includere lettere maiuscole e minuscole, cifre, trattini (ma non nella prima o nell'ultima posizione) e punti (nel caso di sottodomini). Poiché gli underscore non sono ammessi, al posto di \w usiamo 3 diversi set di caratteri: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+
- Dominio di primo livello È costituito da un punto seguito da lettere maiuscole e minuscole. Può contenere da 2 a 24 lettere (il TLD più lungo attualmente esistente): \.[A-Za-z]{2,24}
- Fornisce un riferimento all'intervallo a RegExpMatch, in modo da restituire un array di valori TRUE e FALSE.
- Utilizzare una doppia negazione (--) per costringere i valori logici a uno e zero.
- Utilizzate la funzione SUM per sommare gli 1 e gli 0 della matrice risultante.
- Sul Dati Ablebits nella scheda Testo gruppo, fare clic su Strumenti Regex .
- Sul Strumenti Regex fare quanto segue:
- Selezionare le stringhe di origine.
- Inserite il vostro modello.
- Scegliere il Partita opzione.
- Per avere i risultati come formule e non come valori, selezionare l'opzione Inserire come formula casella di controllo.
- Fare clic sul pulsante Partita pulsante.
- La funzione può essere inserito direttamente in una cella attraverso lo standard Funzione di inserimento nella finestra di dialogo, dove è classificata sotto la voce AblebitsUDFs .
- Per impostazione predefinita, l'espressione regolare viene aggiunta alla formula, ma è anche possibile mantenerla in una cella separata. A tale scopo, è sufficiente utilizzare un riferimento di cella per il secondo argomento.
- Per impostazione predefinita, la funzione è sensibile alle maiuscole e alle minuscole Per una corrispondenza senza distinzione tra maiuscole e minuscole, utilizzare lo schema (?i).
Regex per NON corrispondere al carattere
Per trovare le stringhe che NON contengono un certo carattere, si possono usare le classi di caratteri negati [^ ] che corrispondono a tutto ciò che NON è tra parentesi. Ad esempio:
In un elenco di numeri di telefono, supponiamo di voler trovare quelli che non hanno un prefisso internazionale. Tenendo presente che qualsiasi codice internazionale include il segno +, è possibile utilizzare la classe di caratteri [^\+] per trovare le stringhe che non contengono il segno più. È importante capire che l'espressione sopra riportata corrisponde a qualsiasi singolo carattere che non sia +. Poiché un numero di telefono può trovarsi in qualsiasi punto di una stringa, nonnecessariamente all'inizio, il quantificatore * viene aggiunto per controllare ogni carattere successivo. Gli ancoraggi iniziale ^ e finale $ assicurano che l'intera stringa venga elaborata. Come risultato, otteniamo la seguente espressione regolare che dice "non corrispondere al carattere + in nessuna posizione della stringa".
Modello : ^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex per NON corrispondere alla stringa
Sebbene non esista una sintassi speciale per le espressioni regolari che non corrispondono a una stringa specifica, è possibile emulare questo comportamento utilizzando un lookahead negativo.
Supponiamo di voler trovare delle stringhe che non contengono La parola "limoni". Questa espressione regolare funzionerà benissimo:
Modello : ^((?!limoni).)*$
Ovviamente è necessaria qualche spiegazione. Il lookahead negativo (?!lemons) guarda a destra per vedere se non c'è la parola "lemons" davanti a noi. Se "lemons" non c'è, allora il punto corrisponde a qualsiasi carattere tranne un'interruzione di riga. L'espressione precedente esegue un solo controllo e il quantificatore * lo ripete zero o più volte, dall'inizio della stringa ancorata da ^ alla fine della stringa ancorata da$.
Per ignorare le maiuscole e le minuscole del testo, impostiamo il terzo argomento su FALSE, in modo da rendere la nostra funzione insensibile alle maiuscole e alle minuscole:
=RegExpMatch(A5, $A$2, FALSE)
Suggerimenti e note:
Corrispondenza senza distinzione tra maiuscole e minuscole
Nelle espressioni regolari classiche, esiste un modello speciale per la corrispondenza senza distinzione tra maiuscole e minuscole (?i), che non è supportato in VBA RegExp. Per superare questa limitazione, la nostra funzione personalizzata accetta il terzo argomento opzionale denominato match_case Per fare una corrispondenza senza distinzione tra maiuscole e minuscole, è sufficiente impostarla su FALSE.
Supponiamo che si vogliano identificare date come 1-Mar-22 o 01-Mar-2022. Per abbinare i dati di gg-mmm-aaaa e d-mmm-yy utilizziamo la seguente espressione regolare.
Modello \b\d{1,2}-(Jan
La nostra espressione cerca un gruppo di 1 o 2 cifre, seguite da un trattino, seguite da una qualsiasi delle abbreviazioni del mese separate da
Perché non usare uno schema più semplice come \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Per evitare false corrispondenze positive come 01-ABC-2020.
Inserite il modello in A2 e otterrete la seguente formula:
=RegExpMatch(A5, $A$2, FALSE)
Regex per la corrispondenza di indirizzi e-mail validi
Come generalmente noto, un indirizzo e-mail è composto da 4 parti: nome utente, simbolo @, nome del dominio (server di posta) e dominio di primo livello (come .com, .edu, .org, ecc.). Per verificare la validità dell'indirizzo e-mail, dovremo replicare la struttura di cui sopra utilizzando le espressioni regolari.
Modello : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Per capire meglio cosa sta succedendo, analizziamo più da vicino ogni parte:
Nota: lo schema presuppone che il nome di dominio contenga 2 o più caratteri alfanumerici.
Con il testo originale in A5 e il modello in A5, la formula assume questa forma:
=RegExpMatch(A5, $A$2)
Oppure si può utilizzare un'espressione regolare più semplice per la convalida delle e-mail con un set di caratteri minuscoli o maiuscoli:
Modello : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Ma fate in modo che la formula sia insensibile alle maiuscole e alle minuscole:
=RegExpMatch(A5, $A$2, FALSE)
Formula IF di Excel con corrispondenza regex
Poiché le funzioni integrate e quelle personalizzate vanno d'accordo, nulla vieta di utilizzarle insieme in un'unica formula.
Per restituire o calcolare qualcosa se un'espressione regolare corrisponde e qualcos'altro se non corrisponde, incorporare la funzione RegExpMatch personalizzata nel testo logico di IF:
IF(RegExpMatch(...), [value_if_true], [value_if_false])Ad esempio, se una stringa in A5 contiene un indirizzo e-mail valido, è possibile restituire "Sì", altrimenti "No".
=IF(RegExpMatch(A5, $A$2,), "Sì", "No")
Conta se la regex corrisponde
Poiché le funzioni native di Excel non supportano le espressioni regolari, non è possibile inserire una regex direttamente nella funzione COUNTIS o COUNTIFS. Fortunatamente, è possibile emulare questa funzionalità utilizzando la nostra funzione personalizzata.
Supponiamo di aver utilizzato una regex per confrontare i numeri di telefono e di aver visualizzato i risultati nella colonna B. Per scoprire quante celle contengono numeri di telefono, è sufficiente contare i valori VERO in B5:B9. Questo può essere fatto facilmente utilizzando la formula standard COUNTIF:
=COUNTIF(B5:B9, TRUE)
Se non volete colonne aggiuntive nel vostro foglio di lavoro, non c'è problema. Tenendo presente che la nostra funzione personalizzata può elaborare più celle alla volta e che SOMMA di Excel può sommare i valori di una matrice, ecco cosa fare:
=SOMMA(--RegExpMatch(A5:A9, $A$2))
Corrispondenza Regex con Ultimate Suite
Gli utenti della nostra Ultimate Suite possono sfruttare quattro potenti funzioni Regex senza aggiungere alcun codice VBA alle loro cartelle di lavoro, poiché vengono integrate senza problemi in Excel durante l'installazione del componente aggiuntivo. Le nostre funzioni personalizzate vengono elaborate dal motore RegEx standard .NET e supportano le espressioni regolari classiche complete.
Come utilizzare la funzione RegexMatch personalizzata
Supponendo che sia installata l'ultima versione di Ultimate Suite (2021.4 o successiva), è possibile creare una formula Regex Match in due semplici passaggi:
Un attimo dopo, il AblebitsRegexMatch viene inserito in una nuova colonna a destra dei dati.
Nella schermata seguente, la funzione controlla se le stringhe della colonna A contengono o meno numeri a 7 cifre.
Suggerimenti:
Per ulteriori informazioni, consultare la funzione AblebitsRegexMatch.
Ecco come eseguire la corrispondenza con le espressioni regolari in Excel. Vi ringrazio per la lettura e vi aspetto sul nostro blog la prossima settimana!
Download disponibili
Esempi di corrispondenza Regex di Excel (file .xlsm)
Ultimate Suite 14 giorni versione completamente funzionale (file .exe)