Excel Regex: coincideix cadenes amb expressions regulars

  • Comparteix Això
Michael Brown

En aquest tutorial, veurem en profunditat com utilitzar l'expressió regular per fer coincidir cadenes a Excel.

Quan necessiteu trobar un valor determinat en un interval de cel·les, hauríeu d'utilitzar la funció MATCH o XMATCH. Quan busqueu una cadena específica en una cel·la, les funcions FIND i SEARCH són útils. I com saps si una cel·la conté informació que coincideix amb un patró determinat? Òbviament, utilitzant expressions regulars. Però, fora de la caixa, Excel no admet execucions regulars! No us preocupeu, ho obligarem a :)

    Funció d'Excel VBA Regex per fer coincidir les cadenes

    Com queda bastant clar a l'encapçalament, per utilitzar expressions regulars a Excel, heu de crear la vostra pròpia funció. Afortunadament, el VBA d'Excel té un objecte RegExp integrat, que podeu utilitzar al vostre codi com es mostra a continuació:

    Funció pública RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'matriu per emmagatzemar els resultats Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'índex de la fila actual a l'interval d'origen, índex de la columna actual a l'interval d'origen, recompte de files, recompte de columnes En cas d'error GoTo ErrHandl RegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp") regex.pattern = patró regex.Global = True regex.MultiLine = True If True = match_case Then regex.ignorecase = False Else Regex.ignorecase = True Finalexpressions.

    Patró : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b

    Per entendre millor què està passant aquí, fem una ullada més de prop a cada part :

    • El nom d'usuari pot incloure lletres, números, guions baixos, punts i guions. Tenint en compte que \w coincideix amb qualsevol lletra, dígit o guió baix, obtenim l'expressió regular següent: [\w\.\-]+
    • El nom de domini pot incloure lletres majúscules i minúscules, dígits, guions (però no a la primera ni a l'última posició) i punts (en el cas dels subdominis). Com que els guions baixos no es permeten, en comptes de \w estem utilitzant 3 jocs de caràcters diferents: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • El domini de primer nivell consta d'un punt seguit de lletres majúscules i minúscules. Pot contenir de 2 a 24 lletres (el TLD més llarg que existeix actualment): \.[A-Za-z]{2,24}

    Nota. El patró suposa que el nom de domini conté 2 o més caràcters alfanumèrics.

    Amb el text original en A5 i el patró en A5, la fórmula pren aquesta forma:

    =RegExpMatch(A5, $A$2)

    O podeu utilitzar un text normal més senzill. expressió per a la validació del correu electrònic amb un conjunt de caràcters en majúscules o minúscules:

    Patró : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b

    Però feu que la fórmula no distingeix entre majúscules i minúscules:

    =RegExpMatch(A5, $A$2, FALSE)

    Fórmula d'Excel IF amb expressió regular de coincidència

    A causa del fet que la funció integrada i personalitzadales funcions funcionen molt bé, no hi ha res que us impedeixi utilitzar-les juntes en una única fórmula.

    Per tornar o calcular alguna cosa si coincideix amb una expressió regular i una altra cosa si no coincideix, incrusta el RegExpMatch personalitzat funció al text lògic de IF:

    IF(RegExpMatch(…), [value_if_true], [value_if_false])

    Per exemple, si una cadena a A5 conté una adreça de correu electrònic vàlida, podeu tornar "Sí"; en cas contrari "No".

    =IF(RegExpMatch(A5, $A$2,), "Yes", "No")

    Compteu si coincideix l'expressió regular

    Com que les funcions natives d'Excel no admeten expressions regulars, és no és possible posar una expressió regular directament a la funció COUNTIS o COUNTIFS. Afortunadament, podeu emular aquesta funcionalitat mitjançant la nostra funció personalitzada.

    Suposant que heu utilitzat una expressió regular per fer coincidir els números de telèfon i mostrar els resultats a la columna B. Per saber quantes cel·les contenen números de telèfon, només necessiteu per comptar els valors TRUE a B5:B9. I això es pot fer fàcilment mitjançant la fórmula estàndard COUNTIF:

    =COUNTIF(B5:B9, TRUE)

    No voleu cap columna addicional al vostre full de treball? Cap problema. Tenint en compte que la nostra funció personalitzada pot processar diverses cel·les alhora i la SUMA d'Excel pot sumar valors en una matriu, això és el que feu:

    • Proporcioneu una referència d'interval a RegExpMatch, de manera que retorna un matriu de valors VERDADERS i FALS.
    • Utilitzeu una doble negació (--) per coaccionar els valors lògics a uns izeros.
    • Obtenir la funció SUMA per sumar 1 i 0 a la matriu resultant.

    =SUM(--RegExpMatch(A5:A9, $A$2))

    Concordança d'expressions regulars amb Ultimate Suite

    Els usuaris de la nostra Ultimate Suite poden aprofitar quatre potents funcions Regex sense afegir cap codi VBA als seus llibres de treball, ja que s'integren sense problemes a Excel durant la instal·lació del complement. Les nostres funcions personalitzades les processa el motor estàndard .NET RegEx i admeten expressions regulars clàssiques amb totes les funcions.

    Com utilitzar la funció RegexMatch personalitzada

    Suposant que teniu instal·lada la darrera versió d'Ultimate Suite ( 2021.4 o posterior), podeu crear una fórmula de concordança Regex en dos passos senzills:

    1. A la pestanya Dades d'Ablebits , al grup Text , feu clic a Eines d'expressió regular .

  • A la subfinestra Eines d'expressió regular , feu el següent:
    • Seleccioneu les cadenes d'origen.
    • Introduïu el vostre patró.
    • Trieu l'opció Concorda .
    • Per tenir els resultats com a fórmules, no com a valors, seleccioneu l'opció Insereix com a fórmula casella de selecció.
    • Feu clic al botó Concorda .

    Un moment després, la funció AblebitsRegexMatch s'insereix en una nova columna a la dreta de les vostres dades.

    A la captura de pantalla següent, la funció comprova si les cadenes de la columna A contenen 7 dígits. nombres o no.

    Consells:

    • La funció es pot inserir directament en una cel·la mitjançant el quadre de diàleg estàndard Insereix funció , on es classifica a AblebitsUDFs .
    • Per defecte, s'afegeix una expressió regular a la fórmula, però també podeu mantenir en una cel·la separada. Per a això, només cal que utilitzeu una referència de cel·la per al segon argument.
    • Per defecte, la funció és distingeix entre majúscules i minúscules . Per a la concordança que no distingeix entre majúscules i minúscules, utilitzeu el patró (?i).

    Per obtenir més informació, consulteu la funció AblebitsRegexMatch.

    Així és com fer la concordança d'expressions regulars a Excel. Us agraeixo la lectura i espero veure-us al nostre blog la setmana vinent!

    Descàrregues disponibles

    Excels d'Excel Regex Match (fitxer .xlsm)

    Ultimate Suite 14- versió totalment funcional del dia (fitxer .exe)

    Si cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows For iInputCurCol = 1 To cntInputCurCol = 1 To cntInputRows,TrInputRows arr. .Cells(iInputCurRow, iInputCurCol).Value) Següent Següent RegExpMatch = arRes Funció de sortida ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Enganxeu el codi a l'editor VBA i la vostra nova funció RegExpMatch llest per al seu ús. Si no tens molta experiència amb VBA, aquesta guia pot ser útil: Com inserir codi VBA a Excel.

    Nota. Després d'inserir el codi, recordeu desar el fitxer com a llibre de treball habilitat per a macro (.xlsm).

    Sintaxi RegExpMatch

    La funció RegExpMatch comprova si alguna part de la cadena d'origen coincideix amb una expressió regular. El resultat és un valor booleà: TRUE si es troba almenys una coincidència, FALSE en cas contrari.

    La nostra funció personalitzada té 3 arguments: els dos primers són obligatoris i l'últim és opcional:

    RegExpMatch(text , patró, [match_case])

    On:

    • Text (obligatori): una o més cadenes per cercar. Es pot proporcionar com a referència de cel·la o interval.
    • Patró (obligatori): l'expressió regular que coincideix. Quan es col·loca directament en una fórmula, un patró s'ha de tancar entre cometes dobles.
    • Match_case (opcional) - defineix la coincidènciatipus. Si és TRUE o s'omet (per defecte), es realitza una concordança que distingeix entre majúscules i minúscules; si FALSE: no distingeix entre majúscules i minúscules.

    La funció funciona en totes les versions d'Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 i Excel 2010.

    3 coses que teniu hauria de saber sobre RegExpMatch

    Abans d'arribar als càlculs pràctics, tingueu en compte els punts següents que aclareixen alguns aspectes tècnics:

    1. La funció pot processar una cel·la única o interval de cel·les . En aquest últim cas, els resultats es retornen a les cel·les veïnes en forma d'una matriu dinàmica o un rang de vessament, com es mostra en aquest exemple.
    2. Per defecte, la funció és distingeix entre majúscules i minúscules . Per ignorar les majúscules i minúscules del text, establiu l'argument match_case a FALSE. A causa de les limitacions de l'expressió regular de VBA, no s'admet el patró que no distingeix entre majúscules i minúscules (?i).
    3. Si no es troba un patró vàlid, la funció retorna FALSE; si el patró no és vàlid , un #VALOR! es produeix un error.

    A continuació, trobareu alguns exemples de concordança d'expressions regulars que es van crear amb finalitats de demostració. No podem garantir que els nostres patrons funcionin sense errors amb una gamma més àmplia de dades d'entrada als vostres fulls de treball reals. Abans de posar en producció, assegureu-vos de provar i ajustar els nostres patrons de mostres segons les vostres necessitats.

    Com utilitzar regex per fer coincidir cadenes a Excel

    Quan totes les cadenes que voleu fer coincidir tenen el mateix patró,les expressions regulars són una solució ideal.

    Suposant que teniu un rang de cel·les (A5:A9) que contenen diversos detalls sobre alguns elements. Voleu saber quines cel·les tenen SKU. Suposant que cada SKU consta de 2 lletres majúscules, un guionet i 3 dígits, podeu fer-los coincidir amb l'expressió següent.

    Patró : \b[A-Z]{2}-\ d{3}\b

    On [A-Z]{2} significa 2 lletres majúscules de l'A a la Z i \d{3} significa 3 dígits del 0 al 9. El caràcter \b denota una paraula límit, és a dir, un SKU és una paraula independent i no forma part d'una cadena més gran, com ara 23-MAR-2022.

    Amb el patró establert, podem passar a escriure una fórmula. Essencialment, utilitzar una funció personalitzada no és diferent d'una nativa. Tan bon punt comenceu a escriure una fórmula, el nom de la funció apareixerà a la llista suggerida per l'Autocompletar d'Excel. Tanmateix, hi ha un parell de matisos a Dynamic Array Excel (Microsoft 365 i Excel 2021) i Excel tradicional (2019 i versions anteriors).

    Concorda la cadena en una cel·la

    Per fer coincidir una cadena en una sola cel·la, feu referència a aquesta cel·la en el primer argument. Se suposa que el segon argument conté una expressió regular.

    =RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")

    El patró també es pot mantenir en una cel·la predefinida, que està bloquejada amb una referència absoluta ($A$2):

    =RegExpMatch(A5, $A$2)

    Després d'introduir la fórmula a la primera cel·la, podeu arrossegar-la a totes les altres files.

    Aquest mètodefunciona molt bé en totes les versions d'Excel .

    Concorda cadenes de diverses cel·les alhora

    Per fer coincidir diverses cadenes amb una única fórmula, Incloeu una referència d'interval al primer argument:

    =RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")

    A Excel 365 i Excel 2021 que admeten matrius dinàmiques, funciona d'aquesta manera: escriviu la fórmula a la primera cel·la, premeu Retorn i la fórmula s'aboca automàticament a les cel·les següents.

    A Excel 2019 i anteriors, només funciona com una fórmula de matriu CSE tradicional, que s'introdueix en un rang de cel·les i es completa prement les tecles Ctrl + Maj + Intro juntes.

    Execució regular per coincidir amb el número

    Per fer coincidir qualsevol dígit del 0 al 9, utilitzeu el caràcter \d de l'expressió regular. Depenent de la vostra tasca en particular, afegiu un quantificador adequat o creeu un patró més complex.

    Regex per fer coincidir qualsevol número

    Per fer coincidir qualsevol número de qualsevol longitud, poseu el quantificador + just després de / caràcter d, que diu que cal buscar números que continguin 1 o més dígits.

    Patró : \d+

    =RegExpMatch(A5:A9, "\d+")

    Regex per fer coincidir un nombre de longitud específica

    Si el vostre objectiu és fer coincidir valors numèrics que continguin un nombre determinat de dígits, feu servir \d juntament amb un quantificador adequat.

    Per exemple, per fer coincidir els números de factura que consten exactament de 7 dígits, haureu d'utilitzar \d{7}. Tanmateix, tingueu en compte que coincidirà amb 7com s'esperava:

    Notes:

    • Els codis internacionals no estan comprovats, de manera que poden o no estar presents.
    • En les expressions regulars, \s representa qualsevol caràcter d'espai en blanc com ara un espai, tabulació, retorn de carro o línia nova. Per permetre només espais, utilitzeu [-\. ] en comptes de [-\.\s].
    • Regex per NO coincidir amb el caràcter

      Per trobar cadenes que NO contenen un caràcter determinat, podeu utilitzar classes de caràcters negats [^ ] que coincideixin qualsevol cosa que NO entre parèntesis. Per exemple:

      • [^13] coincidirà amb qualsevol caràcter que no sigui 1 o 3.
      • [^1-3] coincidirà amb qualsevol caràcter que no sigui 1, 2 o 3 (és a dir, qualsevol dígit de l'1 al 3).

      En una llista de números de telèfon, suposem que voleu trobar els que no tenen un codi de país. Tenint en compte que qualsevol codi internacional inclou el signe +, podeu utilitzar la classe de caràcters [^\+] per trobar cadenes que no continguin el signe més. És important adonar-se que l'expressió anterior coincideix amb qualsevol caràcter que no sigui +. Com que un número de telèfon pot estar en qualsevol part d'una cadena, no necessàriament al principi, s'afegeix el quantificador * per comprovar cada caràcter posterior. Les àncores inicial ^ i final $ asseguren que es processa tota la cadena. Com a resultat, obtenim l'expressió regular següent que diu "no coincideix amb el caràcter + en cap posició de la cadena".

      Patró :^[^\+]*$

      =RegExpMatch(A5, "^[^\+]*$")

      Regex per NO coincidir amb la cadena

      Tot i que no hi ha una sintaxi d'expressió regular especial per a no coincideix amb una cadena específica, podeu emular aquest comportament utilitzant una mirada negativa.

      Suposant que voleu trobar cadenes que no continguin la paraula "llimones". Aquesta expressió regular serà un plaer:

      Patró : ^((?!llimones).)*$

      Òbviament, aquí cal una mica d'explicació. La mirada negativa (?!lemons) mira cap a la dreta per veure si no hi ha cap paraula "llimones" per davant. Si "llimones" no hi és, el punt coincideix amb qualsevol caràcter excepte un salt de línia. L'expressió anterior només realitza una comprovació i el quantificador * la repeteix zero o més vegades, des de l'inici de la cadena ancorada per ^ fins al final de la cadena ancorada per $.

      Per ignorar el cas del text, establim el tercer argument com a FALSE perquè la nostra funció no distingeixi entre majúscules i minúscules:

      =RegExpMatch(A5, $A$2, FALSE)

      Consells i notes:

      • L'expressió regular anterior només funciona per a cadenes d'una sola línia . En el cas de cadenes de miltilínies, els caràcters ^ i $ coincideixen amb l'inici i el final de cada línia en comptes de l'inici i el final de la cadena d'entrada, per tant, l'expressió regular només cerca a la primera línia.
      • Per fer coincidir les cadenes que no comencen amb un text determinat , utilitzeu una expressió regular com ara ^(?!lemons).*$
      • Per fer coincidir les cadenes que no acaben amb un text determinat , incloul'àncora de la cadena final al patró de cerca: ^((?!lemons$).)*$

      Concordança insensible a majúscules i minúscules

      En les expressions regulars clàssiques, hi ha un patró especial per concordança que no distingeix entre majúscules i minúscules (?i), que no és compatible amb VBA RegExp. Per superar aquesta limitació, la nostra funció personalitzada accepta el tercer argument opcional anomenat match_case . Per fer una concordança que no distingeix entre majúscules i minúscules, simplement defineix-la com a FALSE.

      Suposem que vols identificar dates com ara l'1-22-mar-2022 o l'01-mar-2022. Per fer coincidir els formats dd-mmm-aaaa i d-mmm-aa , utilitzem l'expressió regular següent.

      Patró : \b\d{1,2}-(gendígits a qualsevol part de la cadena, inclòs un nombre de 10 o 100 dígits. Si això no és el que busqueu, poseu el límit de la paraula \b als dos costats.

      Patró : \b\d{7}\b

      =RegExpMatch(A5:A9, "\b\d{7}\b")

      Exposició regular per fer coincidir els números de telèfon

      Com que els números de telèfon es poden escriure en diversos formats, fer-los coincidir requereix una expressió regular més sofisticada.

      En el conjunt de dades següent, cercarem números de 10 dígits que tinguin 3 dígits als 2 primers grups i 4 dígits a l'últim grup. Els grups es poden separar amb un punt, un guionet o un espai. El primer grup pot estar tancat o no entre parèntesis.

      Patró: (\(\d{3}\)

    Michael Brown és un entusiasta de la tecnologia dedicat amb una passió per simplificar processos complexos mitjançant eines de programari. Amb més d'una dècada d'experiència en la indústria tecnològica, ha perfeccionat les seves habilitats en Microsoft Excel i Outlook, així com en Google Sheets i Docs. El bloc de Michael es dedica a compartir els seus coneixements i experiència amb altres persones, oferint consells i tutorials fàcils de seguir per millorar la productivitat i l'eficiència. Tant si sou un professional experimentat com si sou un principiant, el bloc de Michael ofereix valuoses idees i consells pràctics per treure el màxim profit d'aquestes eines de programari essencials.