Satura rādītājs
Š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 FunctionIevietojiet 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:
- Šī 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ā.
- 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).
- 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].
- [^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).
- 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$).)*$
- 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}.
- 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ā.
- 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.
- 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).
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:
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:
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:
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:
=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:
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:
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)