Cuprins
În acest tutorial, vom examina în profunzime cum să folosim regex pentru a potrivi șiruri de caractere în Excel.
Atunci când trebuie să găsiți o anumită valoare într-un interval de celule, veți folosi funcția MATCH sau XMATCH. Atunci când căutați un anumit șir de caractere într-o celulă, funcțiile FIND și SEARCH sunt utile. Și cum știți dacă o celulă conține informații care se potrivesc cu un anumit tipar? Evident, folosind expresii regulate. Dar, din start, Excel nu suportă regexurile! Nu vă faceți griji, îl vom forța noi să o facă :)
Funcția Excel VBA Regex pentru a potrivi șiruri de caractere
După cum reiese destul de clar din titlu, pentru a utiliza expresii regulate în Excel, trebuie să vă creați propria funcție. Din fericire, VBA din Excel are o funcție încorporată de RegExp pe care îl puteți utiliza în codul dvs. așa cum se arată mai jos:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'array to store the results Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'index of the current row in the source range, index of the current column in the source range, count of rows, count of columns 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 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End FunctionLipiți codul în editorul VBA, iar noul dvs. RegExpMatch este gata de utilizare. Dacă nu aveți prea multă experiență cu VBA, acest ghid vă poate fi de ajutor: Cum să inserați cod VBA în Excel.
Notă: După ce ați inserat codul, nu uitați să salvați fișierul ca fișier registru de lucru activat de macro (.xlsm).
Sintaxa RegExpMatch
The RegExpMatch verifică dacă orice parte a șirului sursă se potrivește cu o expresie regulată. Rezultatul este o valoare booleană: TRUE dacă se găsește cel puțin o potrivire, FALSE în caz contrar.
Funcția noastră personalizată are 3 argumente - primele două sunt obligatorii, iar ultimul este opțional:
RegExpMatch(text, model, [match_case])Unde:
- Text (obligatoriu) - unul sau mai multe șiruri de caractere în care se efectuează căutarea. Poate fi furnizat ca referință de celulă sau de interval.
- Model (obligatoriu) - expresia regulată care trebuie să se potrivească. Atunci când este plasat direct într-o formulă, un model trebuie să fie inclus în ghilimele duble.
- Cazul_de_corespondență (opțional) - definește tipul de potrivire. Dacă TRUE sau este omis (implicit), se efectuează o potrivire care ține cont de majuscule și minuscule; dacă FALSE - nu ține cont de majuscule și minuscule.
Funcția funcționează în toate versiunile de Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 și Excel 2010.
3 lucruri pe care ar trebui să le știți despre RegExpMatch
Înainte de a trece la calculele practice, vă rugăm să țineți cont de următoarele puncte care clarifică unele aspecte tehnice:
- Funcția poate procesa un celulă unică sau interval de celule În acest din urmă caz, rezultatele sunt returnate în celulele învecinate sub forma unui tablou dinamic sau a unui interval de vărsare, așa cum se arată în acest exemplu.
- În mod implicit, funcția este Sensibil la majuscule și minuscule Pentru a ignora cazul textului, setați match_case la FALSE. Din cauza limitărilor VBA Regexp, nu este acceptat modelul care nu ține cont de majuscule și minuscule (?i).
- Dacă nu se găsește un model valid, funcția returnează FALSE; dacă se găsește un model valid, funcția returnează FALSE. modelul nu este valabil , apare o eroare #VALUE!
Mai jos, veți găsi câteva exemple de potrivire regex care au fost create în scopuri demonstrative. Nu putem garanta că modelele noastre vor funcționa fără probleme cu o gamă mai largă de date de intrare în foile dvs. de lucru reale. Înainte de a le pune în producție, asigurați-vă că testați și ajustați modelele din exemplele noastre în funcție de nevoile dvs.
Cum să utilizați regex pentru a potrivi șiruri de caractere în Excel
Atunci când toate șirurile de caractere pe care doriți să le potriviți au același model, expresiile regulate reprezintă o soluție ideală.
Să presupunem că aveți un interval de celule (A5:A9) care conțin diverse detalii despre anumite articole. Doriți să aflați care celule au SKU. Presupunând că fiecare SKU este format din 2 litere majuscule, o cratimă și 3 cifre, le puteți potrivi folosind următoarea expresie.
Model : \b[A-Z]{2}-\d{3}\b
Unde [A-Z]{2} înseamnă oricare 2 litere majuscule de la A la Z și \d{3} înseamnă oricare 3 cifre de la 0 la 9. Caracterul \b indică o limită de cuvânt, ceea ce înseamnă că un SKU este un cuvânt separat și nu face parte dintr-un șir mai mare, cum ar fi 23-MAR-2022.
Odată stabilit modelul, putem trece la scrierea unei formule. În esență, utilizarea unei funcții personalizate nu diferă cu nimic de cea a unei funcții native. De îndată ce începeți să tastați o formulă, numele funcției va apărea în lista sugerată de Autocompletare Excel. Cu toate acestea, există câteva nuanțe în Dynamic Array Excel (Microsoft 365 și Excel 2021) și Excel tradițional (2019 și versiunile mai vechi).
Potrivește șirul într-o singură celulă
Pentru a potrivi un șir de caractere într-o singură celulă, faceți referire la acea celulă în primul argument. Al doilea argument trebuie să conțină o expresie regulată.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Modelul poate fi, de asemenea, păstrat într-o celulă predefinită, care este blocată cu o referință absolută ($A$2):
=RegExpMatch(A5, $A$2)
După ce introduceți formula în prima celulă, o puteți trage în jos pe toate celelalte rânduri.
Această metodă funcționează foarte bine în toate versiunile Excel .
Potriviți șiruri de caractere în mai multe celule deodată
Pentru a potrivi mai multe șiruri de caractere cu o singură formulă, includeți o referință la interval în primul argument:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
În Excel 365 și Excel 2021 care acceptă matrice dinamice, funcționează astfel - introduceți formula în prima celulă, apăsați Enter , iar formula se revarsă automat în celulele de mai jos.
În Excel 2019 și mai devreme, funcționează doar ca o formulă de matrice CSE tradițională, care se introduce într-un interval de celule și se completează prin apăsarea simultană a tastelor Ctrl + Shift + Enter.
Regex pentru a se potrivi cu numărul
Pentru a potrivi orice cifră unică de la 0 la 9, utilizați \d În funcție de sarcina dvs. specifică, adăugați un cuantificator adecvat sau creați un model mai complex.
Regex pentru a se potrivi cu orice număr
Pentru a potrivi orice număr de orice lungime, puneți cuantificatorul + imediat după caracterul /d, care spune să căutați numere care conțin 1 sau mai multe cifre.
Model : \d+
=RegExpMatch(A5:A9, "\d+")
Regex pentru a se potrivi cu un număr de o anumită lungime
Dacă obiectivul dvs. este de a potrivi valori numerice care conțin un anumit număr de cifre, utilizați \d împreună cu un cuantificator corespunzător.
De exemplu, pentru a potrivi numere de factură formate din exact 7 cifre, ați folosi \d{7}. Totuși, rețineți că va potrivi 7 cifre oriunde în șir, inclusiv un număr de 10 sau 100 de cifre. Dacă nu este ceea ce căutați, puneți cuvântul limită \b pe ambele părți.
Model : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Regex pentru a potrivi numerele de telefon
Deoarece numerele de telefon pot fi scrise în diferite formate, potrivirea lor necesită o expresie regulată mai sofisticată.
În setul de date de mai jos, vom căuta numere de 10 cifre care au 3 cifre în primele 2 grupuri și 4 cifre în ultimul grup. Grupurile pot fi separate prin punct, cratimă sau spațiu. Primul grup poate fi sau nu inclus în paranteze.
Model: (\(\d{3}\)
Descompunând această expresie regulată, iată ce obținem:
- Prima parte (\(\d{3}\)
- Partea [-\.\s]? înseamnă 0 sau 1 apariție a oricărui caracter între paranteze pătrate: cratimă, punct sau spațiu alb.
- Apoi, mai există încă un grup de 3 cifre d{3} urmat de orice cratimă, punct sau spațiu alb [\-\.\s]? care apare 0 sau 1 dată.
- Ultimul grup de 4 cifre \d{4} este urmat de un cuvânt de delimitare \b pentru a arăta clar că un număr de telefon nu poate face parte dintr-un număr mai mare.
Cu șirul original din A5 și expresia regulată din A2, formula are următoarea formă:
=RegExpMatch(A5, $A$2)
... și funcționează exact așa cum era de așteptat:
Note:
- Codurile internaționale nu sunt verificate, astfel încât este posibil ca acestea să fie sau să nu fie prezente.
- În expresiile regulate, \s reprezintă orice caracter de spațiu alb, cum ar fi un spațiu, tabulație, revenire la cărămidă sau linie nouă. Pentru a permite numai spații, utilizați [-\. ] în loc de [-\.\s].
- [^13] se va potrivi cu orice caracter unic care nu este 1 sau 3.
- [^1-3] se va potrivi cu orice caracter care nu este 1, 2 sau 3 (adică orice cifră de la 1 la 3).
- Regex-ul de mai sus funcționează doar pentru o singură linie În cazul șirurilor cu mai multe linii, caracterele ^ și $ se potrivesc la începutul și la sfârșitul fiecărei linii în loc de începutul și sfârșitul șirului de intrare, prin urmare regex-ul caută numai în prima linie.
- Pentru a se potrivi cu șiruri de caractere care nu porniți cu un anumit text , folosiți o expresie regulată, cum ar fi ^(?!lemons).*$
- Pentru a se potrivi cu șiruri de caractere care nu se termină cu un anumit text , includeți șirul de caractere de sfârșit în modelul de căutare: ^(((?!lemons$).)*$
- Nume utilizator poate include litere, numere, sublinieri, puncte și liniuțe. Ținând cont de faptul că \w se potrivește cu orice literă, cifră sau subliniere, obținem următorul regex: [\w\.\-]+
- Nume de domeniu poate include litere majuscule și minuscule, cifre, liniuțe (dar nu în prima sau ultima poziție) și puncte (în cazul subdomeniilor). Deoarece nu sunt permise sublinierile, în loc de \w folosim 3 seturi de caractere diferite: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+[A-Za-z0-9]+
- Domeniu de nivel superior este format dintr-un punct urmat de litere majuscule și minuscule. Poate conține de la 2 la 24 de litere (cel mai lung TLD existent în prezent): \.[A-Za-z]{2,24}
- Furnizați o referință de interval pentru RegExpMatch, astfel încât acesta să returneze o matrice de valori TRUE și FALSE.
- Utilizați o dublă negație (--) pentru a transforma valorile logice în unu și zero.
- Obțineți funcția SUM pentru a aduna 1 și 0 din matricea rezultată.
- Pe Date Ablebits în fila Text grup, faceți clic pe Instrumente Regex .
- Pe Instrumente Regex faceți următoarele:
- Selectați șirurile sursă.
- Introduceți modelul dumneavoastră.
- Alegeți Meci opțiune.
- Pentru a avea rezultatele sub formă de formule, nu de valori, selectați opțiunea Introduceți ca o formulă caseta de selectare.
- Faceți clic pe butonul Meci buton.
- Funcția poate fi introdus direct într-o celulă prin intermediul standardului Funcția de inserție în care este clasificat la rubrica AblebitsUDFs .
- În mod implicit, o expresie regulată este adăugată la formulă, dar o puteți păstra și într-o celulă separată. Pentru aceasta, utilizați doar o referință de celulă pentru cel de-al doilea argument.
- În mod implicit, funcția este Sensibil la majuscule și minuscule Pentru o potrivire care nu ține cont de majuscule și minuscule, utilizați modelul (?i).
Regex pentru a NU se potrivi cu caracterul
Pentru a găsi șiruri de caractere care NU conțin un anumit caracter, puteți utiliza clase de caractere negate [^ ] care se potrivesc cu tot ceea ce NU se află între paranteze. De exemplu:
Într-o listă de numere de telefon, să presupunem că doriți să le găsiți pe cele care nu au un cod de țară. Ținând cont de faptul că orice cod internațional include semnul +, puteți utiliza clasa de caractere [^\+] pentru a găsi șiruri care nu conțin semnul plus. Este important să realizați că expresia de mai sus se potrivește cu orice caracter unic care nu este +. Deoarece un număr de telefon poate fi oriunde într-un șir, nuneapărat chiar la început, se adaugă cuantificatorul * pentru a verifica fiecare caracter ulterior. Ancorele de început ^ și de sfârșit $ asigură că întregul șir este procesat. Ca rezultat, obținem expresia regulată de mai jos care spune "nu se potrivește cu caracterul + în nicio poziție din șir".
Model : ^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Regex pentru a NU se potrivi cu șirul
Deși nu există o sintaxă specială de expresie regulată pentru a nu se potrivi cu un anumit șir de caractere, puteți emula acest comportament prin utilizarea unui lookahead negativ.
Să presupunem că doriți să găsiți șiruri care nu conțin Această expresie regulată va funcționa de minune:
Model : ^(((?!lămâi).)*$
Evident, este nevoie de câteva explicații aici. Lookahead negativ (?!lemons) se uită în dreapta pentru a vedea dacă nu există cuvântul "lemons" în față. Dacă "lemons" nu este acolo, atunci punctul se potrivește cu orice caracter, cu excepția unei întreruperi de linie. Expresia de mai sus efectuează o singură verificare, iar cuantificatorul * o repetă de zero sau mai multe ori, de la începutul șirului ancorat de ^ până la sfârșitul șirului ancorat de$.
Pentru a ignora majusculele din text, am setat al treilea argument la FALSE pentru a face funcția noastră insensibilă la majuscule:
=RegExpMatch(A5, $A$2, FALSE)
Sfaturi și note:
Potrivire insensibilă la majuscule și minuscule
În expresiile regulate clasice, există un model special pentru potrivirea insensibilă la majuscule și minuscule (?i), care nu este acceptat în VBA RegExp. Pentru a depăși această limitare, funcția noastră personalizată acceptă al treilea argument opțional numit match_case Pentru a face o potrivire care nu ține cont de majuscule și minuscule, setați pur și simplu la FALSE.
Să presupunem că doriți să identificați date precum 1-Mar-22 sau 01-MAR-2022. Pentru a potrivi datele dd-mmm-yyyy și d-mmm-yy folosim următoarea expresie regulată.
Model : \b\d{1,2}-(Jan
Expresia noastră caută un grup de 1 sau 2 cifre, urmate de o cratimă, urmate de oricare dintre abrevierile lunilor separate prin
De ce să nu folosiți un model mai simplu, cum ar fi \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Pentru a preveni potrivirile fals pozitive, cum ar fi 01-ABC-2020.
Introduceți modelul în A2 și veți obține următoarea formulă:
=RegExpMatch(A5, $A$2, FALSE)
Regex pentru a potrivi adresele de e-mail valide
După cum se știe în general, o adresă de e-mail este formată din 4 părți: nume de utilizator, simbol @, nume de domeniu (serverul de e-mail) și domeniu de nivel superior (cum ar fi .com, .edu, .org etc.). Pentru a verifica validitatea adresei de e-mail, va trebui să replicăm structura de mai sus folosind expresii regulate.
Model : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Pentru a înțelege mai bine ce se întâmplă aici, să analizăm mai atent fiecare parte:
Notă. Modelul presupune că numele de domeniu conține 2 sau mai multe caractere alfanumerice.
Cu textul original în A5 și modelul în A5, formula ia această formă:
=RegExpMatch(A5, $A$2)
Sau puteți utiliza o expresie regulată mai simplă pentru validarea e-mailurilor cu un set de caractere minuscule sau majuscule:
Model : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Dar nu țineți cont de majuscule și minuscule în formula dumneavoastră:
=RegExpMatch(A5, $A$2, FALSE)
Formula Excel IF cu regex de potrivire
Datorită faptului că funcțiile încorporate și cele personalizate se înțeleg foarte bine, nimic nu vă împiedică să le folosiți împreună într-o singură formulă.
Pentru a returna sau a calcula ceva dacă o expresie regulată se potrivește și altceva dacă nu se potrivește, încorporați funcția personalizată RegExpMatch în textul logic al IF:
IF(RegExpMatch(...), [value_if_true], [value_if_false])De exemplu, dacă un șir de caractere din A5 conține o adresă de e-mail validă, puteți returna "Da"; în caz contrar, "Nu".
=IF(RegExpMatch(A5, $A$2,), "Da", "Nu")
Numără dacă se potrivește regex-ul
Deoarece funcțiile native Excel nu acceptă expresii regulate, nu este posibil să introduceți un regex direct în funcția COUNTIS sau COUNTIFS. Din fericire, puteți emula această funcționalitate utilizând funcția noastră personalizată.
Să presupunem că ați folosit un regex pentru a potrivi numerele de telefon și ați afișat rezultatele în coloana B. Pentru a afla câte celule conțin numere de telefon, trebuie doar să numărați valorile TRUE din B5:B9. Și acest lucru se poate face cu ușurință folosind formula standard COUNTIF:
=COUNTIF(B5:B9, TRUE)
Nu doriți coloane suplimentare în foaia de calcul? Nici o problemă. Ținând cont de faptul că funcția noastră personalizată poate procesa mai multe celule simultan și că SUM din Excel poate aduna valorile dintr-o matrice, iată ce trebuie să faceți:
=SUM(--RegExpMatch(A5:A9, $A$2))
Potrivirea Regex cu Ultimate Suite
Utilizatorii suitei noastre Ultimate Suite pot profita de patru funcții Regex puternice fără a adăuga vreun cod VBA în registrele lor de lucru, deoarece acestea sunt integrate fără probleme în Excel în timpul instalării add-in-ului. Funcțiile noastre personalizate sunt procesate de motorul standard .NET RegEx și acceptă expresii regulate clasice complete.
Cum se utilizează funcția RegexMatch personalizată
Presupunând că aveți instalată cea mai recentă versiune de Ultimate Suite (2021.4 sau o versiune ulterioară), puteți crea o formulă Regex Match în doi pași simpli:
O clipă mai târziu, a apărut AblebitsRegexMatch este inserată într-o nouă coloană în dreapta datelor dumneavoastră.
În captura de ecran de mai jos, funcția verifică dacă șirurile din coloana A conțin sau nu numere de 7 cifre.
Sfaturi:
Pentru mai multe informații, vă rugăm să consultați funcția AblebitsRegexMatch.
Iată cum se face potrivirea expresiilor regulate în Excel. Vă mulțumesc pentru lectură și vă aștept pe blog săptămâna viitoare!
Descărcări disponibile
Exemple de potrivire Regex Excel (fișier .xlsm)
Ultimate Suite 14-day full-functional version (fișier .exe)