Turinys
Šioje pamokoje išsamiai apžvelgsime, kaip "Excel" programoje naudoti regex eilutėms suderinti.
Kai reikia rasti tam tikrą reikšmę ląstelių intervale, naudojate funkciją MATCH arba XMATCH. Ieškant konkrečios eilutės ląstelėje, praverčia funkcijos FIND ir SEARCH. O kaip sužinoti, ar ląstelėje yra informacijos, atitinkančios tam tikrą šabloną? Akivaizdu, kad naudodami reguliariąsias išraiškas. Tačiau "Excel" nepalaiko regeksų! Nesijaudinkite, mes ją priversime :)
"Excel" VBA "Regex" funkcija, skirta eilutėms suderinti
Kaip aišku iš antraštės, norėdami naudoti reguliarias išraiškas "Excel" programoje, turite sukurti savo funkciją. Laimei, "Excel" VBA turi integruotą funkciją RegExp objektą, kurį galite naudoti savo kode, kaip parodyta toliau:
Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'masyvas rezultatams saugoti Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'dabartinės eilutės indeksas šaltinio diapazone, dabartinio stulpelio indeksas šaltinio diapazone, eilučių skaičius, stulpelių skaičius 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.igrecase = False Else regex.igrecase = 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 FunctionĮklijuokite kodą į VBA redaktorių, ir jūsų naujasis RegExpMatch funkcija paruošta naudoti. Jei neturite daug patirties VBA srityje, jums gali būti naudingas šis vadovas: Kaip įterpti VBA kodą į "Excel".
Pastaba. Įterpę kodą, nepamirškite išsaugoti failo kaip darbaknygė su makrokomandomis (.xlsm).
RegExpMatch sintaksė
Svetainė RegExpMatch funkcija tikrina, ar kuri nors pradinės eilutės dalis atitinka reguliariąją išraišką. Rezultatas yra loginė reikšmė: TRUE, jei rastas bent vienas atitikmuo, FALSE, jei ne.
Mūsų pasirinktinė funkcija turi 3 argumentus - pirmieji du yra privalomi, o paskutinis - neprivalomas:
RegExpMatch(tekstas, šablonas, [match_case])Kur:
- Tekstas (privaloma) - viena ar kelios eilutės, kuriose bus ieškoma. Galima pateikti kaip ląstelės arba intervalo nuorodą.
- Modelis (privaloma) - reguliarioji išraiška, kurią reikia suderinti. Kai šablonas įrašomas tiesiogiai į formulę, jis turi būti pateiktas dvigubose kabutėse.
- Match_case (neprivaloma) - apibrėžia atitikimo tipą. Jei TRUE arba praleista (numatytoji reikšmė), atliekamas atitikimas pagal didžiąsias raides; jei FALSE - atitikimas pagal didžiąsias raides.
Funkcija veikia visose "Excel 365", "Excel 2021", "Excel 2019", "Excel 2019", "Excel 2016", "Excel 2013" ir "Excel 2010" versijose.
3 dalykai, kuriuos turėtumėte žinoti apie "RegExpMatch
Prieš pereidami prie praktinių skaičiavimų, atkreipkite dėmesį į šiuos dalykus, kuriuose paaiškinami kai kurie techniniai aspektai:
- Funkcija gali apdoroti atskira ląstelė arba ląstelių diapazonas Pastaruoju atveju rezultatai grąžinami kaimyniniuose langeliuose kaip dinaminis masyvas arba išsiliejimo diapazonas, kaip parodyta šiame pavyzdyje.
- Pagal numatytuosius nustatymus funkcija yra , kai atsižvelgiama į mažąsias ir didžiąsias raides. Jei norite nepaisyti teksto raidžių, nustatykite match_case argumentas FALSE. Dėl VBA "Regexp" apribojimų nepalaikomas šablonas (?i), kai neskiriama didžioji ir mažoji raidės.
- Jei nerandamas galiojantis šablonas, funkcija grąžina FALSE; jei modelis negalioja , įvyksta #VALUE! klaida.
Toliau rasite keletą regex atitikmenų pavyzdžių, sukurtų demonstravimo tikslais. Negalime garantuoti, kad mūsų pavyzdžiai veiks nepriekaištingai, jei realiuose darbalapiuose bus naudojami įvairesni įvesties duomenys. Prieš naudodami gamyboje, būtinai išbandykite ir pritaikykite mūsų pavyzdžių pavyzdžius pagal savo poreikius.
Kaip naudoti regex eilutėms suderinti "Excel" programoje
Kai visos norimos sutapatinti eilutės turi tą patį šabloną, reguliariosios išraiškos yra idealus sprendimas.
Tarkime, kad turite langelių intervalą (A5:A9), kuriame pateikiama įvairi informacija apie kai kurias prekes. Norite sužinoti, kuriuose langeliuose yra SKU. Darant prielaidą, kad kiekvieną SKU sudaro 2 didžiosios raidės, brūkšnys ir 3 skaitmenys, galite juos suderinti naudodami šią išraišką.
Modelis : \b[A-Z]{2}-\d{3}\b
Kur [A-Z]{2} reiškia bet kurias 2 didžiąsias raides nuo A iki Z, o \d{3} - bet kuriuos 3 skaitmenis nuo 0 iki 9. Ženklas \b žymi žodžio ribą, t. y. SKU yra atskiras žodis, o ne didesnės eilutės, pavyzdžiui, 23-MAR-2022, dalis.
Sukūrę šabloną, galime pereiti prie formulės rašymo. Iš esmės pasirinktinės funkcijos naudojimas niekuo nesiskiria nuo vietinės funkcijos naudojimo. Vos pradėjus rašyti formulę, funkcijos pavadinimas atsiras sąraše, kurį siūlo "Excel" automatinio užbaigimo funkcija. Tačiau yra keletas niuansų, susijusių su "Dynamic Array Excel" ("Microsoft 365" ir "Excel 2021") ir tradicine "Excel" (2019 m. ir senesnės versijos).
Suderinti eilutę vienoje ląstelėje
Jei norite suderinti eilutę viename langelyje, pirmajame argumente nurodykite tą langelį. Antrajame argumente turi būti pateikta reguliarioji išraiška.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Šabloną taip pat galima laikyti iš anksto nustatytoje ląstelėje, kuri užrakinta absoliučia nuoroda ($A$2):
=RegExpMatch(A5, $A$2)
Įvedę formulę į pirmąją ląstelę, galite ją vilkti žemyn į visas kitas eilutes.
Šis metodas puikiai veikia visos "Excel" versijos .
Vienu metu suderinkite eilutes keliose ląstelėse
Jei norite, kad viena formulė atitiktų kelias eilutes, į pirmąjį argumentą įtraukite diapazono nuorodą:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Svetainėje "Excel 365 ir "Excel 2021 palaikančių dinaminius masyvus, veikia taip: įveskite formulę į pirmąją ląstelę, paspauskite Enter , ir formulė automatiškai išsilies į tolesnes ląsteles.
Svetainėje "Excel 2019 ir ankstesnėse versijose ji veikia tik kaip tradicinė CSE masyvų formulė, kuri įvedama į ląstelių intervalą ir užbaigiama kartu spaudžiant klavišus Ctrl + Shift + Enter.
Regex, kad atitiktų numerį
Norėdami suderinti bet kurį vieną skaitmenį nuo 0 iki 9, naudokite \d Priklausomai nuo konkrečios užduoties, pridėkite tinkamą kvantifikatorių arba sukurkite sudėtingesnį šabloną.
"Regex", kad atitiktų bet kokį skaičių
Jei norite rasti bet kokio ilgio skaičių, iškart po /d simbolio įrašykite kvantifikatorių +, kuris nurodo, kad reikia ieškoti skaičių, turinčių 1 ar daugiau skaitmenų.
Modelis : \d+
=RegExpMatch(A5:A9, "\d+")
"Regex", kad atitiktų tam tikro ilgio skaičių
Jei jūsų tikslas yra suderinti skaitines reikšmes, turinčias tam tikrą skaičių skaitmenų, tuomet naudokite \d kartu su atitinkamu kiekybiniu žodžiu.
Pavyzdžiui, norėdami sutapatinti sąskaitų faktūrų numerius, kuriuos sudaro lygiai 7 skaitmenys, naudokite \d{7}. Tačiau nepamirškite, kad jis sutaps su 7 skaitmenimis bet kurioje eilutės vietoje, įskaitant 10 skaitmenų arba 100 skaitmenų skaičių. Jei ieškote ne to, abiejose pusėse įrašykite žodžių ribą \b.
Modelis : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Telefonų numerių atitikimo regeksas
Kadangi telefono numeriai gali būti užrašyti įvairiais formatais, jiems suderinti reikia sudėtingesnės reguliariosios išraiškos.
Toliau pateiktame duomenų rinkinyje ieškosime 10 skaitmenų skaičių, kurių pirmosiose dviejose grupėse yra 3 skaitmenys, o paskutinėje - 4. Grupės gali būti atskirtos tašku, brūkšneliu arba tarpeliu. Pirmoji grupė gali būti arba nebūti pateikta skliausteliuose.
Modelis: (\(\d{3}\)
Išskaidę šią reguliariąją išraišką, gauname štai ką:
- Pirmoji dalis (\(\d{3}\)
- Dalis [-\.\s]? reiškia 0 arba 1 bet kurio laužtiniuose skliaustuose esančio simbolio: brūkšnelio, taško arba baltosios eilutės.
- Toliau yra dar viena 3 skaitmenų grupė d{3}, po kurios eina bet koks brūkšnys, taškas arba baltasis tarpas [\-\.\s]?, pasitaikantis 0 arba 1 kartą.
- Po paskutinės 4 skaitmenų grupės \d{4} eina žodžių riba \b, kad būtų aišku, jog telefono numeris negali būti didesnio skaičiaus dalis.
Naudojant pradinę eilutę A5 ir reguliariąją išraišką A2, formulė įgauna tokią formą:
=RegExpMatch(A5, $A$2)
... ir veikia tiksliai taip, kaip tikėtasi:
Pastabos:
- Tarptautiniai kodai netikrinami, todėl jų gali būti arba nebūti.
- Reguliariosiose išraiškose \s reiškia bet kokį baltąjį simbolį, pavyzdžiui, tarpą, skirtuką, grįžtamąjį ženklą arba naują eilutę. Jei norite, kad būtų leidžiami tik tarpai, vietoj [-\. ] naudokite [-\.\s].
- [^13] atitiks bet kurį atskirą simbolį, kuris nėra 1 arba 3.
- [^1-3] atitiks bet kurį atskirą simbolį, kuris nėra 1, 2 arba 3 (t. y. bet kurį skaitmenį nuo 1 iki 3).
- Pirmiau pateikta regex veikia tik vienos eilutės eilutės. Jei eilutės yra miltilinijos, ^ ir $ simboliai atitinka kiekvienos eilutės pradžią ir pabaigą, o ne įvesties eilutės pradžią ir pabaigą, todėl regeksas ieško tik pirmoje eilutėje.
- Atitikimas eilutėms, kurios nepradėti su tam tikru tekstu , naudokite reguliariąją išraišką, pavyzdžiui, ^(?!citrinos).*$
- Atitikimas eilutėms, kurios nesibaigia su tam tikru tekstu , į paieškos šabloną įtraukite pabaigos eilutės inkarą: ^(((?!citrinos$).)*$
- Vartotojo vardas gali būti raidės, skaičiai, pabraukimai, taškai ir brūkšneliai. Turint omenyje, kad \w atitinka bet kokią raidę, skaitmenį ar pabraukimą, gauname tokį regeksą: [\w\.\-]+
- Domeno vardas gali būti didžiosios ir mažosios raidės, skaitmenys, brūkšneliai (bet ne pirmoje ar paskutinėje pozicijoje) ir taškai (subdomenų atveju). Kadangi pabraukimai neleidžiami, vietoj \w naudojame 3 skirtingus simbolių rinkinius: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+
- Aukščiausio lygio domenas jį sudaro taškas, po kurio eina didžiosios ir mažosios raidės. Jį gali sudaryti nuo 2 iki 24 raidžių (ilgiausias šiuo metu egzistuojantis aukščiausio lygio domenas): \.[A-Za-z]{2,24}
- Pateikite "RegExpMatch" diapazono nuorodą, kad ji grąžintų TRUE ir FALSE reikšmių masyvą.
- Naudokite dvigubą neigimą (--), kad logines reikšmes priverstinai pakeistumėte į vienetus ir nulius.
- Gaukite funkciją SUM, kad gautame masyve sudėtumėte 1 ir 0.
- Dėl Ablebitų duomenys skirtuke Tekstas grupę, spustelėkite "Regex" įrankiai .
- Dėl "Regex" įrankiai lange atlikite šiuos veiksmus:
- Pasirinkite šaltinio eilutes.
- Įveskite savo modelį.
- Pasirinkite Rungtynės galimybė.
- Jei norite, kad rezultatai būtų formulės, o ne reikšmės, pasirinkite Įterpti kaip formulę žymimasis langelis.
- Spustelėkite Rungtynės mygtuką.
- Funkcija gali būti įdėta tiesiai į ląstelę per standartinį Įterpimo funkcija dialogo langą, kuriame jis priskiriamas kategorijai AblebitsUDFs .
- Pagal numatytuosius nustatymus reguliarioji išraiška įtraukiama į formulę, tačiau ją taip pat galite laikyti atskiroje ląstelėje. Šiuo atveju tiesiog naudokite ląstelės nuorodą kaip 2-ąjį argumentą.
- Pagal numatytuosius nustatymus funkcija yra , kai atsižvelgiama į mažąsias ir didžiąsias raides. . Jei norite, kad atitiktis būtų atliekama neatsižvelgiant į mažąsias ir didžiąsias raides, naudokite (?i) šabloną.
Regex, kad NEatitiktų simbolio
Norėdami rasti eilutes, kuriose NĖRA tam tikro simbolio, galite naudoti neigiamų simbolių klases [^ ], kurios atitinka viską, kas NĖRA skliausteliuose. Pvz:
Tarkime, kad telefono numerių sąraše norite rasti tuos, kurie neturi šalies kodo. Turėdami omenyje, kad bet kuriame tarptautiniame kode yra ženklas +, galite naudoti simbolių klasę [^\+], kad rastumėte eilutes, kuriose nėra pliuso ženklo. Svarbu suprasti, kad pirmiau pateikta išraiška atitinka bet kurį atskirą simbolį, kuris nėra +. Kadangi telefono numeris gali būti bet kurioje eilutės vietoje, o nebūtinai pačioje pradžioje pridedamas kvantifikatorius *, kad būtų tikrinamas kiekvienas tolesnis simbolis. Pradžios ^ ir pabaigos $ inkarai užtikrina, kad būtų apdorojama visa eilutė. Rezultate gauname toliau pateiktą reguliariąją išraišką, kuri sako "nesutapatinti su + simboliu bet kurioje eilutės pozicijoje".
Modelis : ^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
"Regex", kad neatitiktų eilutės
Nors nėra specialios reguliariosios išraiškos sintaksės, kuri leistų nesutapti su konkrečia eilute, galite imituoti tokią elgseną naudodami neigiamą "lookahead" reikšmę.
Tarkime, kad norite rasti eilutes, kurios nėra žodį "citrinos". Ši reguliarioji išraiška puikiai tiks:
Modelis : ^((((?!citrinos).)*$
Akivaizdu, kad čia reikia šiek tiek paaiškinti. Neigiamas žvilgsnis (?!citrinos) žiūri į dešinę, kad įsitikintų, ar priekyje nėra žodžio "citrinos". Jei žodžio "citrinos" ten nėra, taškas atitinka bet kurį simbolį, išskyrus eilutės pertrauką. Pirmiau pateikta išraiška atlieka tik vieną patikrinimą, o kvantifikatorius * jį pakartoja nulį ar daugiau kartų nuo eilutės, pažymėtos ^, pradžios iki eilutės, pažymėtos ^, pabaigos.$.
Norėdami ignoruoti teksto atvejį, nustatome 3 argumentą į FALSE, kad mūsų funkcija neatsižvelgtų į didžiosios ir mažosios raidžių skirtumus:
=RegExpMatch(A5, $A$2, FALSE)
Patarimai ir pastabos:
Atitikimas neatsižvelgiant į mažąsias ir didžiąsias raides
Klasikinėse reguliariosiose išraiškose yra specialus šablonas, skirtas atitikčiai, kai neskiriama didžioji ir mažoji raidės (?i), kuris VBA RegExp nepalaikomas. Kad būtų įveiktas šis apribojimas, mūsų pasirinktinė funkcija priima 3 pasirenkamąjį argumentą, pavadintą match_case . Jei norite, kad atitiktis būtų atliekama neatsižvelgiant į mažąsias ir didžiąsias raides, tiesiog nustatykite reikšmę FALSE.
Tarkime, norite nustatyti tokias datas kaip 1 MAR-22 arba 01 MAR-2022. Norėdami suderinti dd-mmm-ryyyy ir d-mmm-yy formatus, naudojame šią reguliariąją išraišką.
Modelis : \b\d{1,2}-(Jan
Mūsų išraiška ieško 1 arba 2 skaitmenų grupės, po kurios eina brūkšnelis, po kurio eina bet kuri mėnesio santrumpa, atskirta jungtuku
Kodėl nenaudoti paprastesnio šablono, pavyzdžiui, \d{1,2}-[A-Za-z]{3}-\d{2,4}\b?
Įveskite modelį A2 ir gausite šią formulę:
=RegExpMatch(A5, $A$2, FALSE)
Regex, kad atitiktų galiojančius el. pašto adresus
Kaip žinoma, el. pašto adresą sudaro 4 dalys: vartotojo vardas, @ simbolis, domeno vardas (pašto serveris) ir aukščiausio lygio domenas (pvz., .com, .edu, .org ir t. t.). Norėdami patikrinti el. pašto adreso galiojimą, turėsime pakartoti minėtą struktūrą naudodami reguliariąsias išraiškas.
Modelis : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Kad geriau suprastumėte, kas čia vyksta, atidžiau apžvelkime kiekvieną dalį:
Pastaba. Šablone daroma prielaida, kad domeno vardą sudaro 2 ar daugiau raidinių ir skaitmeninių simbolių.
Jei pradinis tekstas yra A5 formato langelyje, o modelis - A5 formato langelyje, formulė įgauna tokią formą:
=RegExpMatch(A5, $A$2)
Arba galite naudoti paprastesnę reguliariąją išraišką el. pašto patvirtinimui su mažųjų arba didžiųjų raidžių simbolių rinkiniu:
Modelis : \b[\w\.\-]+@[a-z0-9]+[a-z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Tačiau formulėje nereikėtų nurodyti mažųjų ir didžiųjų raidžių:
=RegExpMatch(A5, $A$2, FALSE)
"Excel" IF formulė su regex atitikmeniu
Kadangi integruotos ir pasirinktinės funkcijos puikiai dera tarpusavyje, niekas nedraudžia jų naudoti kartu vienoje formulėje.
Norėdami grąžinti arba apskaičiuoti kažką, jei reguliarioji išraiška sutampa, ir kažką kitą, jei ji nesutampa, įterpkite pasirinktinę "RegExpMatch" funkciją į loginį IF tekstą:
IF(RegExpMatch(...), [value_if_true], [value_if_false])Pavyzdžiui, jei eilutėje A5 yra galiojantis el. pašto adresas, galite grąžinti "Taip", priešingu atveju - "Ne".
=IF(RegExpMatch(A5, $A$2,), "Taip", "Ne")
Skaičiuokite, ar regex atitinka
Kadangi vietinės "Excel" funkcijos nepalaiko reguliariųjų išraiškų, regex negalima tiesiogiai įrašyti į funkciją COUNTIS arba COUNTIFS. Laimei, šią funkciją galite imituoti naudodami mūsų pasirinktinę funkciją.
Tarkime, kad telefonų numerių atitikčiai naudojote regex ir rezultatus išvedėte į stulpelį B. Norėdami sužinoti, kiek langelių yra telefonų numeriai, tiesiog turite suskaičiuoti B5:B9 langeliuose esančias TRUE reikšmes. Tai galima lengvai padaryti naudojant standartinę COUNTIF formulę:
=COUNTIF(B5:B9, TRUE)
Nenorite, kad darbalapyje būtų papildomų stulpelių? Ne bėda. Turėdami omenyje, kad mūsų pasirinktinė funkcija vienu metu gali apdoroti kelis langelius, o "Excel" funkcija SUM gali sudėti masyvo reikšmes, elkitės taip:
=SUMA(--RegExpMatch(A5:A9, $A$2))
"Regex" atitikmenų nustatymas naudojant "Ultimate Suite
"Ultimate Suite" naudotojai gali naudotis keturiomis galingomis "Regex" funkcijomis, nepridėdami jokio VBA kodo į sąsiuvinius, nes jos sklandžiai integruojamos į "Excel" diegiant priedą. Mūsų pasirinktines funkcijas apdoroja standartinis .NET "RegEx" variklis ir jos palaiko visas klasikines reguliarias išraiškas.
Kaip naudoti pasirinktinę funkciją "RegexMatch
Jei įdiegta naujausia "Ultimate Suite" versija (2021.4 ar vėlesnė), "Regex Match" formulę galite sukurti dviem paprastais veiksmais:
Po akimirkos AblebitsRegexMatch funkcija įterpiama į naują stulpelį duomenų dešinėje.
Toliau pateiktoje ekrano kopijoje funkcija tikrina, ar A stulpelyje esančiose eilutėse yra 7 skaitmenų skaičių, ar ne.
Patarimai:
Daugiau informacijos rasite AblebitsRegexMatch funkcijoje.
Štai kaip "Excel" programoje atlikti reguliariųjų išraiškų atitikimą. Dėkoju, kad perskaitėte, ir laukiu jūsų mūsų tinklaraštyje kitą savaitę!
Galimi atsisiuntimai
"Excel" regex atitikmenų pavyzdžiai (.xlsm failas)
"Ultimate Suite" 14 dienų pilnai veikianti versija (.exe failas)