Excel Regex: virkņu saskaņošana, izmantojot regulārās izteiksmes

  • Dalīties Ar Šo
Michael Brown

Šajā pamācībā mēs padziļināti aplūkosim, kā izmantot regeksus, lai saskaņotu virknes programmā Excel.

Ja jums ir jāatrod noteikta vērtība šūnu diapazonā, izmantojiet funkciju MATCH vai XMATCH. Ja šūnā meklējat konkrētu virkni, noderēs funkcijas FIND un SEARCH. Un kā jūs uzzināsiet, vai šūnā ir informācija, kas atbilst noteiktam paraugam? Acīmredzot, izmantojot regulārās izteiksmes. Bet Excel neatbalsta regeksus! Nav jāuztraucas, mēs piespiedīsim to darīt :)

    Excel VBA Regex funkcija, lai saskaņotu virknes

    Kā jau no virsraksta ir skaidrs, lai Excel programmā izmantotu regulārās izteiksmes, ir jāizveido sava funkcija. Par laimi, Excel VBA programmā ir iebūvēta funkcija RegExp objektu, ko varat izmantot savā kodā, kā parādīts tālāk:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'masīvs rezultātu glabāšanai Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'pašreizējās rindas indekss avota diapazonā, pašreizējās kolonnas indekss avota diapazonā, rindu skaits, kolonnu skaits 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 Līdz cntInputRows, 1 Līdz cntInputCols) For iInputCurRow = 1 Līdz cntInputRows ForiInputCurCol = 1 Līdz cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Ievietojiet kodu VBA redaktorā, un jūsu jaunais RegExpMatch Ja jums nav lielas pieredzes VBA izmantošanā, jums var noderēt šī rokasgrāmata: Kā ievietot VBA kodu programmā Excel.

    Piezīme. Pēc koda ievietošanas neaizmirstiet saglabāt failu kā darbgrāmata ar iespējotu makru (.xlsm).

    RegExpMatch sintakse

    Portāls RegExpMatch funkcija pārbauda, vai kāda avota virknes daļa atbilst regulārajai izteiksmei. Rezultāts ir logaritma vērtība: TRUE, ja ir atrasta vismaz viena atbilstība, pretējā gadījumā FALSE.

    Mūsu pielāgotajai funkcijai ir 3 argumenti - pirmie divi ir obligāti, bet pēdējais nav obligāts:

    RegExpMatch(teksts, modelis, [match_case])

    Kur:

    • Teksts (obligāts) - viena vai vairākas virknes, pēc kurām meklēt. Var norādīt kā atsauci uz šūnu vai diapazonu.
    • Modelis (obligāts) - regulārā izteiksme, kas jāsalīdzina. Ja paraugs ievietots tieši formulā, tas jāietver divās pēdiņās.
    • Match_case (nav obligāts) - nosaka atbilstības tipu. Ja TRUE vai izlaists (noklusējums), tiek veikta saskaņošana pēc burtu un atbilžu lielumiem; ja FALSE - saskaņošana pēc burtu un atbilžu lielumiem.

    Šī funkcija darbojas visās Excel 365, Excel 2021, Excel 2019, Excel 2019, Excel 2016, Excel 2013 un Excel 2010 versijās.

    3 lietas, kas jāzina par RegExpMatch

    Pirms mēs pievērsīsimies praktiskiem aprēķiniem, lūdzu, ņemiet vērā šādus punktus, kas precizē dažus tehniskus aspektus:

    1. Šī funkcija var apstrādāt viena šūna vai šūnu diapazons Pēdējā gadījumā rezultāti tiek atgriezti blakus esošajās šūnās dinamiskā masīva vai izplūdes diapazona veidā, kā parādīts šajā piemērā.
    2. Pēc noklusējuma funkcija ir lielo un mazo izmēru Lai ignorētu teksta burtus, iestatiet match_case VBA Regexp ierobežojumu dēļ nav atbalstīts uz mazajiem un lielajiem burtiem nenošķirošs modelis (?i).
    3. Ja nav atrasts derīgs raksts, funkcija atgriež FALSE; ja modelis ir nederīgs , rodas #VALUE! kļūda.

    Zemāk atradīsiet dažus regex sakritību piemērus, kas tika izveidoti demonstrācijas nolūkos. Mēs nevaram garantēt, ka mūsu paraugi darbosies bez kļūdām ar plašāku ievades datu klāstu jūsu reālajās darblapās. Pirms ievietošanas ražošanā, noteikti pārbaudiet un pielāgojiet mūsu paraugu paraugus atbilstoši savām vajadzībām.

    Kā lietot regex, lai saskaņotu virknes programmā Excel

    Ja visām virknēm, kuras vēlaties saskaņot, ir vienāds modelis, regulārās izteiksmes ir ideāls risinājums.

    Pieņemsim, ka jums ir šūnu diapazons (A5:A9), kurā ir dažāda informācija par dažām precēm. Jūs vēlaties uzzināt, kurās šūnās ir SKU. Pieņemot, ka katrs SKU sastāv no 2 lielajiem burtiem, defise un 3 cipariem, jūs varat tos salīdzināt, izmantojot šādu izteiksmi.

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

    Kur [A-Z]{2} nozīmē jebkurus 2 lielos burtus no A līdz Z un \d{3} nozīmē jebkurus 3 ciparus no 0 līdz 9. Rakstzīme \b apzīmē vārda robežu, kas nozīmē, ka SKU ir atsevišķs vārds, nevis daļa no lielākas virknes, piemēram, 23-MAR-2022.

    Kad modelis ir izveidots, varam pāriet pie formulas rakstīšanas. Būtībā pielāgotas funkcijas izmantošana neatšķiras no vietējās funkcijas. Tiklīdz sākat rakstīt formulu, funkcijas nosaukums parādīsies sarakstā, ko piedāvā Excel automātiskā papildināšana. Tomēr ir dažas nianses dinamiskajā masīvā Excel (Microsoft 365 un Excel 2021) un tradicionālajā Excel (2019 un vecākās versijas).

    Atbilst virknei vienā šūnā

    Lai saskaņotu virkni vienā šūnā, pirmajā argumentā norādiet šo šūnu. Otrajā argumentā jānorāda regulārā izteiksme.

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

    Šablonu var saglabāt arī iepriekš definētā šūnā, kas ir bloķēta ar absolūtu atsauci ($A$2):

    =RegExpMatch(A5, $A$2)

    Pēc formulas ievadīšanas pirmajā šūnā varat vilkt to uz leju uz visām pārējām rindām.

    Šī metode lieliski darbojas visas Excel versijas .

    Saskaņot virknes vairākās šūnās vienlaicīgi

    Lai ar vienu formulu saskaņotu vairākas virknes, pirmajā argumentā iekļaujiet atsauci uz diapazonu:

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

    In Excel 365 un Excel 2021 kas atbalsta dinamiskos masīvus, tas darbojas šādi - ievadiet formulu pirmajā šūnā, nospiediet Enter , un formula automātiski izplūst uz nākamajām šūnām.

    In Excel 2019 un agrāk tā darbojas tikai kā tradicionālā CSE masīva formula, kas tiek ievadīta šūnu diapazonā un pabeigta, nospiežot kopā taustiņus Ctrl + Shift + Enter.

    Regekss, lai atbilstu skaitlim

    Lai atbilstu jebkuram ciparam no 0 līdz 9, izmantojiet \d Atkarībā no konkrētā uzdevuma pievienojiet piemērotu kvantifikatoru vai izveidojiet sarežģītāku modeli.

    Regekss, lai atbilstu jebkuram skaitlim

    Lai atbilstu jebkuram jebkura garuma skaitlim, uzreiz aiz rakstzīmes /d ievietojiet kvantifikatoru +, kas norāda, ka tiek meklēti skaitļi, kuros ir 1 vai vairāk ciparu.

    Modelis : \d+

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

    Regekss, lai atbilstu noteikta garuma skaitlim

    Ja jūsu mērķis ir saskaņot skaitliskās vērtības, kas satur noteiktu ciparu skaitu, izmantojiet \d kopā ar atbilstošu kvantifikatoru.

    Piemēram, lai atbilstu rēķinu numuriem, kas sastāv tieši no 7 cipariem, izmantojiet \d{7}. Tomēr paturiet prātā, ka tas atbilst 7 cipariem jebkurā virknes vietā, tostarp 10 ciparu vai 100 ciparu skaitlim. Ja tas nav tas, ko meklējat, ievietojiet vārda robežu \b abās pusēs.

    Modelis : \b\d{7}\b

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

    Regekss, lai saskaņotu tālruņu numurus

    Tā kā tālruņa numurus var rakstīt dažādos formātos, to saskaņošanai ir nepieciešama sarežģītāka regulārā izteiksme.

    Tālāk dotajā datu kopā mēs meklēsim 10 ciparu skaitļus, kuru pirmajās divās grupās ir 3 cipari, bet pēdējā grupā - 4 cipari. Grupas var atdalīt ar punktu, defisi vai atstarpi. Pirmo grupu var ietvert vai neietvert iekavās.

    Modelis: (\(\d{3}\)

    Šādas regulārās izteiksmes sadalīšanas rezultātā mēs iegūstam šādu rezultātu:

    • Pirmā daļa (\(\d{3}\)
    • Daļa [-\.\s]? nozīmē 0 vai 1 jebkuras kvadrātiekavās iekavās ievietotas rakstzīmes: defise, punkts vai baltā zīme.
    • Tālāk ir vēl viena 3 ciparu grupa d{3}, kam seko jebkurš defise, punkts vai baltā zīme [\-\.\s]?, kas parādās 0 vai 1 reizi.
    • Pēdējai 4 ciparu grupai \d{4} seko vārda robeža \b, lai būtu skaidrs, ka tālruņa numurs nevar būt daļa no lielāka numura.

    Izmantojot sākotnējo virkni A5 un regulāro izteiksmi A2, formula ir šāda:

    =RegExpMatch(A5, $A$2)

    ... un darbojas tieši tā, kā paredzēts:

    Piezīmes:

    • Starptautiskie kodi netiek pārbaudīti, tāpēc tie var būt, bet var arī nebūt.
    • Regulārajās izteiksmēs \s apzīmē jebkuru baltās atstarpes rakstzīmi, piemēram, atstarpi, tabulatoru, atgriezenisko rindiņu vai jaunu rindu. Lai atļautu tikai atstarpes, lietojiet [-\. ], nevis [-\.\s].
    • Regekss, lai NEatbilstu rakstzīmei

      Lai atrastu virknes, kurās NAV konkrētas rakstzīmes, varat izmantot noliegto rakstzīmju klases [^ ], kas atbilst jebkurai rakstzīmei, kura NAV iekavās. Piemēram:

      • [^13] atbilst jebkurai vienai rakstzīmei, kas nav 1 vai 3.
      • [^1-3] atbilst jebkuram atsevišķam simbolam, kas nav 1, 2 vai 3 (t. i., jebkuram ciparam no 1 līdz 3).

      Pieņemsim, ka tālruņa numuru sarakstā vēlaties atrast tos, kuriem nav valsts koda. Paturot prātā, ka jebkurš starptautiskais kods ietver + zīmi, varat izmantot rakstzīmju klasi [^\+], lai atrastu virknes, kurās nav plusa zīmes. Ir svarīgi saprast, ka iepriekš minētā izteiksme atbilst jebkurai vienai rakstzīmei, kas nav +. Tā kā tālruņa numurs var atrasties jebkurā virknes vietā, nevis virknē.obligāti pašā sākumā tiek pievienots kvantifikators *, lai pārbaudītu katru nākamo rakstzīmi. Sākuma ^ un beigu $ enkuri nodrošina, ka tiek apstrādāta visa virkne. Rezultātā mēs iegūstam tālāk redzamo regulāro izteiksmi, kas saka "nesakrīt ar rakstzīmi + nevienā virknes pozīcijā".

      Modelis : ^[^\+]*$

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

      Regekss, lai NEatbilstu virknei

      Lai gan nav īpašas regulārās izteiksmes sintakses, lai neatbilstu konkrētai virknei, varat atdarināt šādu rīcību, izmantojot negatīvu lookahead.

      Pieņemsim, ka vēlaties atrast virknes, kas nesatur vārdu "citroni". Šī regulārā izteiksme darbosies lieliski:

      Modelis : ^((((?!citroni).)*$

      Acīmredzot šeit ir nepieciešami daži paskaidrojumi. Negatīvais lookahead (?!citroni) skatās pa labi, lai pārliecinātos, vai priekšā nav vārda "citroni". Ja vārda "citroni" tur nav, tad punkts atbilst jebkurai rakstzīmei, izņemot rindas pārrāvumu. Iepriekš minētā izteiksme veic tikai vienu pārbaudi, un kvantifikators * to atkārto nulle vai vairāk reižu, sākot no rindas sākuma, kas nofiksēta ar ^, līdz rindas beigām, kas nofiksēta ar$.

      Lai neņemtu vērā teksta burtu un atbilstu burtu un atbilstu burtu lielajiem un tiešajiem burtiem, mēs iestatām 3. argumentu uz FALSE, lai mūsu funkcijai nebūtu jūtīga lielo un mazo burtu izvēle:

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

      Padomi un piezīmes:

      • Iepriekš minētais regekss darbojas tikai attiecībā uz vienas rindas Milti rindu virkņu gadījumā ^ un $ rakstzīmes atbilst katras rindas sākumam un beigām, nevis ievades virknes sākumam un beigām, tāpēc regekss meklē tikai pirmajā rindā.
      • Lai atbilstu virknēm, kas nesākt ar noteiktu tekstu , izmantojiet regulāru izteiksmi, piemēram, ^(?!citroni).*$.
      • Lai atbilstu virknēm, kas nebeidzas ar noteiktu tekstu , meklēšanas rakstā iekļaujiet beigu virknes enkuru: ^(((?!citroni$).)*$

      Lietošanas saskaņošana, kas nav atkarīga no burtu un atbilžu lielumiem

      Klasiskajās regulārajās izteiksmēs ir īpašs raksts, kas paredzēts lielo un mazo burtu nenošķiršanai (?i), kas VBA RegExp nav atbalstīts. Lai pārvarētu šo ierobežojumu, mūsu pielāgotā funkcija pieņem 3. izvēles argumentu ar nosaukumu match_case . Lai veiktu lielo un mazo burtu un atbilžu saskaņošanu, vienkārši iestatiet to uz FALSE.

      Pieņemsim, ka vēlaties identificēt datumus, piemēram, 1.marts-22. vai 01.marts-2022. dd-mmm-ggggggg un d-mmm-yy formātos mēs izmantojam šādu regulāro izteiksmi.

      Modelis : \b\d{1,2}-(Jan

      Mūsu izteiksmē tiek meklēta 1 vai 2 ciparu grupa, kam seko defise, pēc tam - kāds no mēneša saīsinājumiem, kas atdalīti ar

      Kāpēc neizmantot vienkāršāku modeli, piemēram, \d{1,2}-[A-Za-z]{3}-\d{2,4}\b? Lai novērstu viltus pozitīvus sakritības, piemēram, 01-ABC-2020.

      Ievadiet modeli A2, un iegūsiet šādu formulu:

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

      Regekss, lai saskaņotu derīgas e-pasta adreses

      Kā zināms, e-pasta adrese sastāv no 4 daļām: lietotājvārda, @ simbola, domēna vārda (pasta servera) un augstākā līmeņa domēna (piemēram, .com, .edu, .org u.c.). Lai pārbaudītu e-pasta adreses derīgumu, mums būs jāatkārto iepriekš minētā struktūra, izmantojot regulārās izteiksmes.

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

      Lai labāk saprastu, kas šeit notiek, aplūkosim katru daļu sīkāk:

      • Lietotājvārds var ietvert burtus, ciparus, pasvītrojumus, punktus un defisi. Paturot prātā, ka \w atbilst jebkuram burtam, ciparam vai pasvītrojumam, mēs iegūstam šādu regekss: [\w\.\-]+
      • Domēna nosaukums var būt lielie un mazie burti, cipari, defise (bet ne pirmajā vai pēdējā pozīcijā) un punkti (apakšdomēnu gadījumā). Tā kā zemsvītras nav atļautas, \w vietā mēs izmantojam 3 dažādas rakstzīmju kopas: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+.
      • Augstākā līmeņa domēns To var veidot punkts, kam seko lieli un mazi burti. Tas var saturēt no 2 līdz 24 burtiem (garākais pašlaik pastāvošais TLD): \.[A-Za-z]{2,24}.

      Piezīme. Šablonā pieņemts, ka domēna nosaukumā ir 2 vai vairāk burtu un ciparu rakstzīmes.

      Ja sākotnējais teksts ir A5 formātā un modelis - A5 formātā, formula iegūst šādu formu:

      =RegExpMatch(A5, $A$2)

      Vai arī e-pasta apstiprināšanai varat izmantot vienkāršāku regulāru izteiksmi ar mazo vai lielo burtu rakstzīmju kopu:

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

      Taču formulā neņemiet vērā mazos un lielos burtus:

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

      Excel IF formula ar regeksiem

      Tā kā iebūvētās un pielāgotās funkcijas labi sader, nekas neliedz tās izmantot kopā vienā formulā.

      Lai kaut ko atgrieztu vai aprēķinātu, ja regulārā izteiksme ir atbilstīga, un kaut ko citu, ja tā nav atbilstīga, iestrādājiet pielāgoto RegExpMatch funkciju IF loģiskajā tekstā:

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

      Piemēram, ja A5 rindā ir norādīta derīga e-pasta adrese, varat atgriezt "Jā", pretējā gadījumā "Nē".

      =IF(RegExpMatch(A5, $A$2,), "Jā", "Nē")

      Skaitīt, ja regekss ir saskaņots

      Tā kā vietējās Excel funkcijas neatbalsta regulārās izteiksmes, nav iespējams ievietot regeksus tieši funkcijā COUNTIS vai COUNTIFS. Par laimi, jūs varat atdarināt šo funkcionalitāti, izmantojot mūsu pielāgoto funkciju.

      Pieņemsim, ka esat izmantojis regeksi, lai saskaņotu tālruņa numurus un rezultātus izvadītu B slejā.Lai noskaidrotu, cik šūnās ir tālruņa numuri, jums vienkārši jāsaskaita TRUE vērtības B5:B9. To var viegli izdarīt, izmantojot standarta COUNTIF formulu:

      =COUNTIF(B5:B9, TRUE)

      Vai nevēlaties, lai darblapā būtu papildu kolonnas? Nav problēmu. Paturot prātā, ka mūsu pielāgotā funkcija var apstrādāt vairākas šūnas vienlaicīgi un Excel SUM var saskaitīt vērtības masīvā, veiciet šādu darbību:

      • Sniedziet RegExpMatch atsauci uz diapazonu, lai tas atgrieztu TRUE un FALSE vērtību masīvu.
      • Izmantojiet dubulto noliegumu (--), lai piespiestu loģiskās vērtības pārvērst vienādos un nulles skaitļos.
      • Iegūstiet funkciju SUM, lai saskaitītu 1 un 0 iegūtajā masīvā.

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

      Regex saskaņošana ar Ultimate Suite

      Mūsu komplekta Ultimate Suite lietotāji var izmantot četras jaudīgas Regex funkcijas, nepievienojot savām darbgrāmatām VBA kodu, jo tās tiek vienmērīgi integrētas programmā Excel papildinājuma instalēšanas laikā. Mūsu pielāgotās funkcijas tiek apstrādātas ar standarta .NET RegEx dzinēju un atbalsta pilnvērtīgas klasiskās regulārās izteiksmes.

      Kā izmantot pielāgotu RegexMatch funkciju

      Pieņemot, ka ir instalēta jaunākā Ultimate Suite versija (2021.4 vai jaunāka), varat izveidot Regex Match formulu, veicot divus vienkāršus soļus:

      1. Par Ablebits dati cilnē Teksts grupu, noklikšķiniet uz Regekses rīki .

    • Par Regekses rīki panelī veiciet šādus darbības:
      • Atlasiet avota virknes.
      • Ievadiet savu modeli.
      • Izvēlieties Match iespēja.
      • Lai rezultātus iegūtu kā formulas, nevis kā vērtības, atlasiet iespēju Ievietot kā formulu izvēles rūtiņu.
      • Noklikšķiniet uz Match pogu.

      Pēc brīža AblebitsRegexMatch funkcija tiek ievietota jaunā slejā pa labi no jūsu datiem.

      Tālāk redzamajā ekrānšāviņas attēlā funkcija pārbauda, vai A slejā esošajās virknēs ir vai nav 7 ciparu skaitļi.

      Padomi:

      • Funkcija var būt ievietots tieši šūnā izmantojot standarta Ievietot funkciju dialoglodziņā, kur tas ir iekļauts kategorijā AblebitsUDFs .
      • Pēc noklusējuma regulārā izteiksme tiek pievienota formulai, taču to var saglabāt arī atsevišķā šūnā. Šim nolūkam 2. argumentam vienkārši izmantojiet šūnas atsauci.
      • Pēc noklusējuma funkcija ir lielo un mazo izmēru Lai veiktu saskaņošanu bez lielo un mazo burtu un atbilstu lielajiem burtiem, izmantojiet modeli (?i).

      Lai iegūtu vairāk informācijas, lūdzu, skatiet AblebitsRegexMatch funkciju.

      Lūk, kā veikt regulārās izteiksmes saskaņošanu programmā Excel. Paldies, ka izlasījāt, un ar nepacietību gaidīsim jūs mūsu blogā nākamnedēļ!

      Pieejamās lejupielādes

      Excel Regex sakritības piemēri (.xlsm fails)

      Ultimate Suite 14 dienu pilnībā funkcionāla versija (.exe fails)

    Maikls Brauns ir īpašs tehnoloģiju entuziasts, kura aizraušanās ir sarežģītu procesu vienkāršošana, izmantojot programmatūras rīkus. Ar vairāk nekā desmit gadu pieredzi tehnoloģiju nozarē viņš ir pilnveidojis savas prasmes programmās Microsoft Excel un Outlook, kā arī Google izklājlapās un dokumentos. Maikla emuārs ir veltīts tam, lai dalītos savās zināšanās un pieredzē ar citiem, sniedzot viegli izpildāmus padomus un pamācības produktivitātes un efektivitātes uzlabošanai. Neatkarīgi no tā, vai esat pieredzējis profesionālis vai iesācējs, Maikla emuārs piedāvā vērtīgas atziņas un praktiskus padomus, kā maksimāli izmantot šos būtiskos programmatūras rīkus.