Regex per rimuovere determinati caratteri o testo in Excel

  • Condividi Questo
Michael Brown

Avete mai pensato a quanto sarebbe potente Excel se qualcuno potesse arricchire la sua cassetta degli attrezzi con le espressioni regolari? Noi non solo ci abbiamo pensato, ma ci abbiamo anche lavorato :) E ora, potete aggiungere questa meravigliosa funzione RegEx alle vostre cartelle di lavoro e cancellare in un attimo le sottostringhe che corrispondono a un modello!

La scorsa settimana abbiamo visto come utilizzare le espressioni regolari per sostituire le stringhe in Excel. A tale scopo abbiamo creato una funzione Regex Replace personalizzata. Come si è scoperto, la funzione va oltre il suo uso primario e può non solo sostituire le stringhe, ma anche rimuoverle. Come è possibile? In termini di Excel, la rimozione di un valore non è altro che la sua sostituzione con una stringa vuota, cosa che la nostra funzione Regex èmolto bravo!

    Funzione VBA RegExp per rimuovere le sottostringhe in Excel

    Come è noto, le espressioni regolari non sono supportate di default in Excel. Per abilitarle, è necessario creare una propria funzione definita dall'utente. La buona notizia è che una funzione di questo tipo è già stata scritta, testata e pronta per l'uso. Tutto ciò che dovete fare è copiare questo codice, incollarlo nell'editor VBA e poi salvare il file come file cartella di lavoro abilitata alle macro (.xlsm).

    La funzione ha la seguente sintassi:

    RegExpReplace(text, pattern, replacement, [instance_num], [match_case])

    I primi tre argomenti sono obbligatori, gli ultimi due sono facoltativi.

    Dove:

    • Testo - la stringa di testo da cercare.
    • Modello - l'espressione regolare da cercare.
    • Sostituzione - il testo da sostituire. A rimuovere le sottostringhe che corrisponde allo schema, utilizzare un stringa vuota ("") per la sostituzione.
    • Numero_istanza (opzionale) - l'istanza da sostituire. Se omesso, tutte le corrispondenze trovate vengono sostituite (impostazione predefinita).
    • Caso_di_corrente (facoltativo) - un valore booleano che indica se abbinare o ignorare le maiuscole e le minuscole del testo. Per una corrispondenza sensibile alle maiuscole e alle minuscole, utilizzare TRUE (valore predefinito); per una corrispondenza non sensibile alle maiuscole e alle minuscole, utilizzare FALSE.

    Per ulteriori informazioni, consultare la funzione RegExpReplace.

    Suggerimento: in casi semplici, è possibile rimuovere caratteri o parole specifiche dalle celle con le formule di Excel, ma le espressioni regolari offrono molte più opzioni.

    Come rimuovere le stringhe utilizzando le espressioni regolari - esempi

    Come già detto, per rimuovere le parti di testo che corrispondono a uno schema, occorre sostituirle con una stringa vuota. Quindi, una formula generica assume questa forma:

    RegExpReplace(text, pattern, "", [instance_num], [match_case])

    Gli esempi seguenti mostrano varie implementazioni di questo concetto di base.

    Rimuovere tutte le corrispondenze o una corrispondenza specifica

    La funzione RegExpReplace è progettata per trovare tutte le sottostringhe che corrispondono a una determinata regex. Le occorrenze da rimuovere sono controllate dal quarto argomento opzionale, denominato numero_istanza .

    L'impostazione predefinita è "tutte le corrispondenze": quando l'opzione numero_istanza Se l'argomento è omesso, tutte le corrispondenze trovate vengono rimosse. Per eliminare una corrispondenza specifica, definire il numero dell'istanza.

    Nelle stringhe sottostanti, supponiamo di voler eliminare il primo numero d'ordine. Tutti i numeri di questo tipo iniziano con il segno hash (#) e contengono esattamente 5 cifre. Possiamo quindi identificarli utilizzando questa regex:

    Modello : #d{5}}b

    Il limite di parola \b specifica che una sottostringa corrispondente non può far parte di una stringa più grande, come #10000001.

    Per rimuovere tutte le corrispondenze, l'opzione numero_istanza non è definito:

    =RegExpReplace(A5, "#\d{5}\b", "")

    Per sradicare solo la prima occorrenza, si imposta il parametro numero_istanza a 1:

    =RegExpReplace(A5, "#\d{5}\b", "", 1)

    Regex per rimuovere alcuni caratteri

    Per eliminare alcuni caratteri da una stringa, è sufficiente scrivere tutti i caratteri indesiderati e separarli con una barra verticale.

    Per esempio, per standardizzare i numeri di telefono scritti in vari formati, prima si eliminano caratteri specifici come parentesi, trattini, punti e spazi bianchi.

    Modello : \(

    =RegExpReplace(A5, "\(

    Il risultato di questa operazione è un numero di 10 cifre come "1234567890".

    Per comodità, è possibile inserire la regex in una cella separata e fare riferimento a tale cella utilizzando un riferimento assoluto, come ad esempio $A$2:

    =RegExpReplace(A5, $A$2, "")

    È poi possibile standardizzare la formattazione nel modo desiderato utilizzando l'operatore di concatenazione (&) e le funzioni di testo come DESTRA, MEDIO e SINISTRA.

    Ad esempio, per scrivere tutti i numeri di telefono nel formato (123) 456-7890, la formula è:

    ="("&SINISTRA(B5, 3)&") "&MEDIO(B5, 4, 3)&"-"&DESTRA(B5, 4)

    Dove B5 è l'output della funzione RegExpReplace.

    Rimuovere i caratteri speciali con la regex

    In una delle nostre esercitazioni abbiamo visto come rimuovere i caratteri indesiderati in Excel utilizzando le funzioni integrate e quelle personalizzate. Le espressioni regolari rendono le cose molto più semplici: invece di elencare tutti i caratteri da eliminare, basta specificare quelli che si desidera mantenere :)

    Il modello si basa su classi di caratteri negati - un caret viene inserito all'interno di una classe di caratteri [^ ] per corrispondere a qualsiasi singolo carattere NON tra parentesi. Il quantificatore + obbliga a considerare i caratteri consecutivi come una singola corrispondenza, in modo che la sostituzione venga effettuata per una sottostringa corrispondente piuttosto che per ogni singolo carattere.

    A seconda delle esigenze, scegliere una delle seguenti regex.

    Per rimuovere non alfanumerico tutti i caratteri tranne le lettere e le cifre:

    Modello : [^0-9a-zA-Z]+

    Per eliminare tutti i caratteri tranne le lettere , cifre e spazi :

    Modello : [^0-9a-zA-Z ]+

    Per eliminare tutti i caratteri tranne le lettere , cifre e trattino basso è possibile utilizzare la sigla W che indica qualsiasi carattere che NON sia alfanumerico o di sottolineatura:

    Modello : \W+

    Se si vuole mantenere altri personaggi , ad esempio i segni di punteggiatura, inserirli all'interno delle parentesi.

    Ad esempio, per eliminare qualsiasi carattere che non sia una lettera, una cifra, un punto, una virgola o uno spazio, utilizzare la seguente regex:

    Modello : [^0-9a-zA-Z., ]+

    In questo modo vengono eliminati tutti i caratteri speciali, ma rimangono degli spazi bianchi in più.

    Per risolvere questo problema, è possibile annidare la funzione precedente in un'altra che sostituisce più spazi con un singolo carattere di spazio.

    =RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")

    Oppure utilizzare la funzione TRIM nativa con lo stesso effetto:

    =TRIM(RegExpReplace(A5, $A$2, ""))

    Regex per rimuovere i caratteri non numerici

    Per eliminare tutti i caratteri non numerici da una stringa, è possibile utilizzare questa lunga formula o una delle semplicissime regex elencate di seguito.

    Corrisponde a qualsiasi carattere che NON sia una cifra:

    Modello : \D+

    Spogliare i caratteri non numerici usando le classi negate:

    Modello : [^0-9]+

    Modello : [^\d]+

    Suggerimento: se l'obiettivo è quello di rimuovere il testo e di riversare i numeri rimanenti in celle separate o di inserirli tutti in un'unica cella separati da un delimitatore specificato, utilizzare la funzione RegExpExtract come spiegato in Come estrarre numeri da una stringa utilizzando le espressioni regolari.

    Regex per rimuovere tutto ciò che viene dopo lo spazio

    Per eliminare tutto ciò che viene dopo uno spazio, utilizzare il carattere spazio ( ) o spazio bianco (\) per trovare il primo spazio e .* per trovare tutti i caratteri successivi.

    Se si dispone di stringhe a riga singola che contengono solo spazi normali (valore 32 nel sistema ASCII a 7 bit), non ha molta importanza quale delle seguenti regex si utilizzi. Nel caso di stringhe a più righe, invece, fa differenza.

    Per rimuovere tutto dopo un carattere di spazio utilizzare questa regex:

    Modello : " .*"

    =RegExpReplace(A5, " .*", "")

    Questa formula eliminerà tutto ciò che si trova dopo il primo spazio in ogni linea Affinché i risultati vengano visualizzati correttamente, assicurarsi di attivare l'opzione Avvolgi testo.

    Per spogliarsi di tutto dopo uno spazio bianco (compresi spazio, tabulazione, ritorno a capo e nuova riga), la regex è:

    Modello : \s.*

    =RegExpReplace(A5, "\s.*", "")

    Poiché \s corrisponde a diversi tipi di spazi bianchi, tra cui una nuova linea (\n), questa formula cancella tutto ciò che si trova dopo il primo spazio in una cella, indipendentemente dal numero di righe presenti.

    Regex per rimuovere il testo dopo un carattere specifico

    Utilizzando i metodi dell'esempio precedente, è possibile eliminare il testo dopo qualsiasi carattere specificato.

    Per gestire ogni riga separatamente:

    Modello generico : char.*

    Nelle stringhe a riga singola, questo rimuove tutto ciò che si trova dopo il termine carbone Nelle stringhe a più righe, ogni riga verrà elaborata singolarmente perché, nel gusto Regex di VBA, un punto (.) corrisponde a qualsiasi carattere tranne una nuova riga.

    Per elaborare tutte le righe come una singola stringa:

    Modello generico : char(.

    Per eliminare qualsiasi cosa dopo un dato carattere, comprese le nuove righe, si aggiunge \n allo schema.

    Ad esempio, per rimuovere il testo dopo la prima virgola in una stringa, provate queste espressioni regolari:

    Modello : ,.*

    Modello : ,(.

    Nella schermata seguente è possibile osservare come i risultati differiscano.

    Regex per rimuovere tutto ciò che precede lo spazio

    Quando si lavora con lunghe stringhe di testo, a volte si desidera accorciarle rimuovendo la stessa parte di informazioni in tutte le celle. Di seguito vengono illustrati due casi di questo tipo.

    Rimuovere tutto ciò che precede l'ultimo spazio

    Come nell'esempio precedente, un'espressione regolare dipende dal concetto di "spazio".

    Per abbinare qualsiasi cosa al ultimo spazio questa regex andrà bene (le virgolette sono aggiunte per rendere evidente lo spazio dopo l'asterisco).

    Modello : ".* "

    Per abbinare qualsiasi cosa prima dell'elemento ultimo spazio bianco (compresi spazio, tabulazione, ritorno a capo e nuova riga), utilizzare questa espressione regolare.

    Modello : .*\s

    La differenza è particolarmente evidente sulle stringhe a più righe.

    Spogliare tutto ciò che precede il primo spazio

    Per abbinare qualsiasi cosa fino al primo spazio in una stringa, è possibile utilizzare questa espressione regolare:

    Modello : ^[^ ]* +

    Dall'inizio di una stringa ^, vengono abbinati zero o più caratteri non spaziali [^ ]* immediatamente seguiti da uno o più spazi " +". L'ultima parte viene aggiunta per evitare potenziali spazi iniziali nei risultati.

    Per rimuovere il testo prima del primo spazio in ogni riga, la formula viene scritta nella modalità predefinita "tutte le corrispondenze" ( numero_istanza omesso):

    =RegExpReplace(A5, "^[^ ]* +", "")

    Per eliminare il testo prima del primo spazio della prima riga e lasciare intatte tutte le altre righe, il comando numero_istanza è impostato su 1:

    =RegExpReplace(A5, "^[^ ]* +", "", 1)

    Regex per eliminare tutto ciò che precede il carattere

    Il modo più semplice per rimuovere tutto il testo prima di un carattere specifico è utilizzare una regex come questa:

    Modello generico : ^[^char]*char

    Tradotto in un linguaggio umano, dice: "dall'inizio di una stringa ancorata da ^, abbinare 0 o più caratteri eccetto carbone [^char]* fino alla prima occorrenza di carbone .

    Ad esempio, per eliminare tutto il testo prima dei due punti, utilizzate questa espressione regolare:

    Modello : ^[^:]*:

    Per evitare spazi iniziali nei risultati, aggiungere un carattere di spazio bianco \s* alla fine, che rimuoverà tutto ciò che precede i primi due punti e taglierà gli spazi subito dopo:

    Modello : ^[^:]*:\s*

    =RegExpReplace(A5, "^[^:]*:\s*", "")

    Suggerimento: oltre alle espressioni regolari, Excel dispone di mezzi propri per rimuovere il testo in base alla posizione o alla corrispondenza. Per sapere come eseguire l'operazione con le formule native, vedere Come rimuovere il testo prima o dopo un carattere in Excel.

    Regex per rimuovere tutto tranne

    Per eliminare tutti i caratteri da una stringa, tranne quelli che si desidera mantenere, utilizzare le classi di caratteri negati.

    Ad esempio, per rimuovere tutti i caratteri tranne le lettere minuscole e i punti, la regex è:

    Modello : [^a-z.]+

    In realtà, potremmo fare a meno del quantificatore +, poiché la nostra funzione sostituisce tutte le corrispondenze trovate. Il quantificatore rende solo un po' più veloce l'operazione: invece di gestire ogni singolo carattere, si sostituisce una sottostringa.

    =RegExpReplace(A5, "[^a-z\.]+", "")

    Regex per rimuovere i tag html in Excel

    Innanzitutto, va notato che l'HTML non è un linguaggio regolare, quindi l'analisi con le espressioni regolari non è il modo migliore. Detto questo, le regex possono sicuramente aiutare a eliminare i tag dalle celle per rendere il set di dati più pulito.

    Dato che i tag html sono sempre collocati all'interno di parentesi angolari, è possibile trovarli utilizzando una delle seguenti regex.

    Classe negata:

    Modello : ]*>

    In questo caso, corrisponde una parentesi angolare di apertura, seguita da zero o più occorrenze di qualsiasi carattere tranne la parentesi angolare di chiusura [^>]* fino alla parentesi angolare di chiusura più vicina.

    Ricerca pigra:

    Modello :

    Il punto interrogativo costringe .* a cercare il minor numero possibile di caratteri finché non trova una parentesi di chiusura.

    Qualunque sia il modello scelto, il risultato sarà assolutamente lo stesso.

    Ad esempio, per rimuovere tutti i tag html da una stringa in A5 e lasciare il testo, la formula è:

    =RegExpReplace(A5, "]*>", "")

    Oppure si può usare il quantificatore pigro, come mostrato nella schermata:

    Questa soluzione funziona perfettamente per i testi singoli (righe 5 - 9). Per i testi multipli (righe 10 - 12), i risultati sono discutibili: i testi di tag diversi vengono fusi in uno solo. È corretto o no? Temo che non sia qualcosa che si possa decidere facilmente: tutto dipende dalla comprensione del risultato desiderato. Ad esempio, in B11 ci si aspetta il risultato "A1", mentre in B10 si potrebbe volere"dati1" e "dati2" devono essere separati da uno spazio.

    Per rimuovere i tag html e separare i testi rimanenti con degli spazi, si può procedere in questo modo:

    1. Sostituire i tag con spazi " ", non con stringhe vuote:

      =RegExpReplace(A5, "]*>", " ")

    2. Riduce gli spazi multipli a un singolo carattere di spazio:

      =RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")

    3. Eliminare gli spazi iniziali e finali:

      =TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))

    Il risultato sarà simile a questo:

    Strumento di rimozione Regex di Ablebits

    Se avete avuto modo di utilizzare la nostra Ultimate Suite per Excel, probabilmente avrete già scoperto i nuovi strumenti Regex introdotti con la recente versione. Il bello di queste funzioni Regex basate su .NET è che, in primo luogo, supportano la sintassi completa delle espressioni regolari senza le limitazioni delle RegExp di VBA e, in secondo luogo, non richiedono l'inserimento di alcun codice VBA nelle cartelle di lavoro, in quanto tutta l'integrazione del codice viene effettuatada noi nel backend.

    La vostra parte di lavoro consiste nel costruire un'espressione regolare e servirla alla funzione :) Vi mostrerò come farlo con un esempio pratico.

    Come rimuovere il testo tra parentesi e parentesi utilizzando le regex

    Nelle stringhe di testo lunghe, le informazioni meno importanti sono spesso racchiuse tra [parentesi] e (parentesi). Come si fa a rimuovere questi dettagli irrilevanti mantenendo tutti gli altri dati?

    In effetti, abbiamo già costruito una regex simile per eliminare i tag html, cioè il testo all'interno delle parentesi angolari. Ovviamente, gli stessi metodi funzioneranno anche per le parentesi quadre e tonde.

    Modello : (\(.*?\))

    Il trucco consiste nell'utilizzare un quantificatore pigro (*?) per trovare una corrispondenza con la sottostringa più breve possibile. Il primo gruppo (\(.*?\)) corrisponde a qualsiasi cosa da una parentesi di apertura alla prima parentesi di chiusura. Il secondo gruppo (\[.*?\]) corrisponde a qualsiasi cosa da una parentesi di apertura alla prima parentesi di chiusura. Una barra verticale

    Una volta determinato lo schema, lo "diamo in pasto" alla nostra funzione Regex Remove. Ecco come fare:

    1. Sul Dati Ablebits nella scheda Testo gruppo, fare clic su Strumenti Regex .

  • Sul Strumenti Regex selezionare le stringhe di origine, inserire la regex, scegliere l'opzione Rimuovere e premere Rimuovere .

    Per ottenere i risultati come formule e non come valori, selezionare l'opzione Inserire come formula casella di controllo.

    Per rimuovere il testo tra parentesi dalle stringhe in A2:A5, configurare le impostazioni come segue:

  • Di conseguenza, il AblebitsRegexRemove viene inserito in una nuova colonna accanto ai dati originali.

    La funzione può anche essere inserita direttamente in una cella tramite la funzione standard Funzione di inserimento nella finestra di dialogo, dove è classificata sotto la voce AblebitsUDFs .

    Come AblebitsRegexRemove è progettata per rimuovere il testo e richiede solo due argomenti: la stringa di origine e la regex. Entrambi i parametri possono essere definiti direttamente in una formula o forniti sotto forma di riferimenti di cella. Se necessario, questa funzione personalizzata può essere utilizzata insieme a qualsiasi altra funzione nativa.

    Ad esempio, per tagliare gli spazi extra nelle stringhe risultanti, è possibile utilizzare la funzione TRIM come wrapper:

    =TRIM(AblebitsRegexRemove(A5, $A$2))

    Ecco come rimuovere le stringhe in Excel utilizzando le espressioni regolari. Vi ringrazio per la lettura e vi aspetto sul nostro blog la prossima settimana!

    Download disponibili

    Rimuovere le stringhe con la regex - esempi (file .xlsm)

    Ultimate Suite - versione di prova (file .exe)

    Michael Brown è un appassionato di tecnologia dedicato con una passione per la semplificazione di processi complessi utilizzando strumenti software. Con oltre un decennio di esperienza nel settore tecnologico, ha affinato le sue competenze in Microsoft Excel e Outlook, nonché in Fogli Google e Documenti. Il blog di Michael è dedicato alla condivisione delle sue conoscenze e competenze con gli altri, fornendo suggerimenti e tutorial facili da seguire per migliorare la produttività e l'efficienza. Che tu sia un professionista esperto o un principiante, il blog di Michael offre spunti preziosi e consigli pratici per ottenere il massimo da questi strumenti software essenziali.