Mündəricat
Bu dərslikdə Excel-də sətirləri uyğunlaşdırmaq üçün regexdən necə istifadə edəcəyimizə ətraflı nəzər salacağıq.
Bir aralıqda müəyyən dəyər tapmaq lazım olduqda xanaların sayı üçün MATCH və ya XMATCH funksiyasından istifadə edərdiniz. Hüceyrədə xüsusi sətir axtararkən, FIND və SEARCH funksiyaları kömək edir. Hüceyrədə verilmiş nümunəyə uyğun məlumatın olub olmadığını necə bilirsiniz? Aydındır ki, müntəzəm ifadələrdən istifadə etməklə. Lakin Excel regexləri dəstəkləmir! Narahat olmayın, biz onu məcbur edəcəyik :)
Excel VBA Regex funksiyasını sətirləri uyğunlaşdırmaq üçün
Normal ifadələrdən istifadə etmək üçün başlıqdan aydın göründüyü kimi Excel-də öz funksiyanızı yaratmalısınız. Xoşbəxtlikdən, Excel-in VBA-da daxili RegExp obyekti var, onu aşağıda göstərildiyi kimi kodunuzda istifadə edə bilərsiniz:
İctimai Funksiya RegExpMatch (input_range As Range, pattern as String , Optional match_case As Boolean = True ) As Variant Dim arRes() Nəticələri saxlamaq üçün Variant 'massivi olaraq Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'mənbə diapazonunda cari sətirin indeksi, mənbə diapazonunda cari sütunun indeksi, sətirlərin sayı, sayı sütunlar Xəta On ErrHandl RegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = nümunə regex.Global = Doğrudursa regex.MultiLine = Doğrudursa = match_case Sonra regex.ignorecase = FalseElignore. Sonifadələr.Nümunə : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Burada nə baş verdiyini daha yaxşı başa düşmək üçün gəlin hər hissəyə daha yaxından nəzər salaq :
- İstifadəçi adı hərflər, rəqəmlər, alt xətt, nöqtələr və defislərdən ibarət ola bilər. \w hər hansı hərf, rəqəm və ya alt xətt ilə uyğunlaşdığını nəzərə alaraq, biz aşağıdakı regexi alırıq: [\w\.\-]+
- Domen adı böyük və kiçik hərflərdən ibarət ola bilər, rəqəmlər, tire (lakin ilk və ya sonuncu mövqedə deyil) və nöqtələr (alt domenlər üçün). Alt xəttlərə icazə verilmədiyi üçün \w əvəzinə 3 fərqli simvol dəstindən istifadə edirik: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- Üst səviyyəli domen nöqtədən sonra böyük və kiçik hərflərdən ibarətdir. O, 2 ilə 24 hərfdən ibarət ola bilər (hazırda mövcud olan ən uzun TLD): \.[A-Za-z]{2,24}
Qeyd. Nümunə domen adının 2 və ya daha çox alfasayısal simvoldan ibarət olduğunu güman edir.
A5-də orijinal mətn və A5-də nümunə ilə düstur bu formanı alır:
=RegExpMatch(A5, $A$2)
Və ya daha sadə adi mətndən istifadə edə bilərsiniz. kiçik və ya böyük hərflərlə e-poçtun təsdiqi üçün ifadə:
Nümunə : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Lakin düsturunuzu böyük hərflərə qarşı həssas edin:
=RegExpMatch(A5, $A$2, FALSE)
Uyğun regex ilə Excel IF düsturu
Daxili və xüsusi olması səbəbindənfunksiyalar gözəl şəkildə gedir, onları bir düsturda birlikdə istifadə etməyinizə heç nə mane ola bilməz.
Normal ifadə uyğun gələrsə, nəyisə qaytarmaq və ya hesablamaq üçün, uyğun gəlmirsə, başqa bir şeyi qaytarmaq üçün fərdi RegExpMatch-i daxil edin. IF məntiqi mətnində funksiya:
IF(RegExpMatch(…), [dəyər_əgər_əgər], [dəyər_əgər_yanlış])Məsələn, A5-dəki sətir etibarlı e-poçt ünvanı ehtiva edirsə, "Bəli" deyə bilərsiniz; əks halda "Xeyr".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
Regex uyğun gəldiyini hesabla
Doğma Excel funksiyaları normal ifadələri dəstəkləmədiyinə görə birbaşa COUNTIS və ya COUNTIFS funksiyasına regex qoymaq mümkün deyil. Xoşbəxtlikdən, siz bizim fərdi funksiyamızdan istifadə edərək bu funksiyanı təqlid edə bilərsiniz.
Fərz edək ki, siz telefon nömrələrini uyğunlaşdırmaq və nəticələri B sütununda çıxarmaq üçün regexdən istifadə etmisiniz. Neçə xanada telefon nömrələri olduğunu öyrənmək üçün sizə sadəcə ehtiyacınız olacaq. B5:B9-da DOĞRU dəyərləri saymaq üçün. Bunu standart COUNTIF düsturundan istifadə etməklə asanlıqla etmək olar:
=COUNTIF(B5:B9, TRUE)
İş vərəqinizdə əlavə sütunlar istəmirsiniz? Problem deyil. Fərdi funksiyamızın eyni vaxtda birdən çox xananı emal edə biləcəyini və Excel-in SUM-un massivdə dəyərlər əlavə edə biləcəyini nəzərə alaraq, siz aşağıdakıları edirsiniz:
- RegExpMatch-ə diapazon arayışı təqdim edin, ona görə də o, DOĞRU və YANLIŞ dəyərlər massivi.
- Məntiqi dəyərləri birlərə məcbur etmək üçün ikiqat inkardan (--) istifadə edin vəsıfırlar.
- Nəticədə massivdə 1 və 0-ları toplamaq üçün SUM funksiyasını əldə edin.
=SUM(--RegExpMatch(A5:A9, $A$2))
Regex uyğunluğu Ultimate Suite ilə
Ultimate Suite-in istifadəçiləri əlavənin quraşdırılması zamanı Excel-ə rahat şəkildə inteqrasiya olunduğu üçün iş kitablarına heç bir VBA kodu əlavə etmədən dörd güclü Regex funksiyasından istifadə edə bilərlər. Fərdi funksiyalarımız standart .NET RegEx mühərriki tərəfindən işlənir və tam xüsusiyyətli klassik müntəzəm ifadələri dəstəkləyir.
Xüsusi RegexMatch funksiyasından necə istifadə etməli
Ultimate Suite proqramının ən son versiyasını quraşdırdığınızı fərz etsək ( 2021.4 və ya daha sonrakı versiyalarda), siz iki sadə addımda Regex Match düsturunu yarada bilərsiniz:
- Ablebits Data nişanında, Mətn qrupunda klikləyin Regeks Alətləri .
- Seçin mənbə sətirləri.
- Nümunənizi daxil edin.
- Uyğunlaşdır seçimini edin.
- Nəticələrin dəyərlər deyil, düsturlar kimi olması üçün
Düstur olaraq daxil edin onay qutusu. - Uyğunlaşdır düyməsini basın.
Bir az sonra AblebitsRegexMatch funksiyası datanızın sağ tərəfindəki yeni sütuna daxil edilir.
Aşağıdakı ekran görüntüsündə funksiya A sütununda 7 rəqəmli sətirlərin olub olmadığını yoxlayır. rəqəmlər və ya deyil.
Məsləhətlər:
- Funk tion daxil edilə bilər birbaşa xanaya standart Funksiya daxil et dialoq qutusu vasitəsilə, burada o, AblebitsUDFs altında təsnif edilir.
- Defolt olaraq, düstura müntəzəm ifadə əlavə edilir, lakin siz onu da saxlaya bilərsiniz. ayrı bir kamerada. Bunun üçün sadəcə 2-ci arqument üçün xana istinadından istifadə edin.
- Defolt olaraq funksiya hərf hərfinə həssasdır . Böyük hərflərə həssas olmayan uyğunluq üçün (?i) nümunəsindən istifadə edin.
Ətraflı məlumat üçün AblebitsRegexMatch funksiyasına baxın.
Excel-də normal ifadə uyğunluğunu belə etmək olar. Oxuduğunuz üçün sizə təşəkkür edirəm və sizi gələn həftə bloqumuzda görməyi səbirsizliklə gözləyirəm!
Mövcud endirmələr
Excel Regex Match nümunələri (.xlsm faylı)
Ultimate Suite 14- gün tam funksional versiyası (.exe faylı)
Əgər cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1 to cntInputRows, 1 to cntInputCols) iInputCurRow = 1 to cntInputRows Üçün iInputCurCol = 1 To cntolCurCol = 1 to cntoolCurCol (cntolesturCiR) üçün cntolesturC .Cells(iInputCurRow, iInputCurCol).Value) Sonrakı Sonrakı RegExpMatch = arRes Çıxış Funksiyası ErrHandl: RegExpMatch = CVErr(xlErrValue) Son FunksiyasıVBA redaktoruna kodu yapışdırın və yeni RegExp funksiyanızdır. istifadəyə hazırdır. VBA ilə çox təcrübəniz yoxdursa, bu təlimat faydalı ola bilər: VBA kodunu Excel-ə necə daxil etmək olar.
Qeyd. Kodu daxil etdikdən sonra faylınızı makro-aktiv iş kitabı (.xlsm) kimi yadda saxlamağı unutmayın.
RegExpMatch sintaksisi
RegExpMatch funksiyası mənbə sətirinin hər hansı bir hissəsinin normal ifadəyə uyğun olub olmadığını yoxlayır. Nəticə Boolean dəyəridir: Ən azı bir uyğunluq aşkar edilərsə DOĞRU, əks halda YANLIŞ.
Fərdi funksiyamızın 3 arqumenti var - ilk ikisi tələb olunur, sonuncu isə isteğe bağlıdır:
RegExpMatch(text , nümunə, [match_case])Burada:
- Mətn (tələb olunur) - axtarış üçün bir və ya bir neçə sətir. Xana və ya diapazona istinad kimi təqdim edilə bilər.
- Nümunə (tələb olunur) - uyğunlaşmaq üçün müntəzəm ifadə. Birbaşa düsturda yerləşdirildikdə nümunə qoşa dırnaq içərisində olmalıdır.
- Match_case (isteğe bağlı) - uyğunluğu müəyyənləşdirirnövü. Əgər DOĞRU və ya buraxılıbsa (defolt), hərflərə həssas uyğunluq həyata keçirilir; əgər YANLIŞ - böyük hərflərə həssasdır.
Funksiya Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 və Excel 2010-un bütün versiyalarında işləyir.
3 şey RegExpMatch haqqında bilməlidir
Praktik hesablamalara keçməzdən əvvəl bəzi texniki cəhətləri aydınlaşdıran aşağıdakı məqamlara diqqət yetirin:
- Funksiya tək xananı<9 emal edə bilər> və ya xanalar diapazonu . Sonuncu halda, nəticələr bu misalda göstərildiyi kimi dinamik massiv və ya dağılma diapazonu şəklində qonşu xanalara qaytarılır.
- Defolt olaraq, funksiya hüquq-həssasdır . Mətn böyüklüyünə məhəl qoymamaq üçün match_case arqumentini FALSE olaraq təyin edin. VBA Regexp məhdudiyyətlərinə görə hərflərə həssas olmayan model (?i) dəstəklənmir.
- Düzgün nümunə tapılmadıqda, funksiya FALSE qaytarır; nümunə etibarsızdırsa , #VALUE! xəta baş verir.
Aşağıda siz nümayiş məqsədilə yaradılmış bir neçə regex uyğunluğu nümunəsini tapa bilərsiniz. Nümunələrimizin real iş vərəqlərinizdə daha geniş diapazonlu daxiletmə məlumatları ilə qüsursuz işləyəcəyinə zəmanət verə bilmərik. İstehsalata başlamazdan əvvəl nümunə nümunələrimizi ehtiyaclarınıza uyğun sınadığınızdan və tənzimlədiyinizdən əmin olun.
Excel-də sətirləri uyğunlaşdırmaq üçün regexdən necə istifadə etməli
Uyğunlaşdırmaq istədiyiniz bütün sətirlər eyni model,müntəzəm ifadələr ideal həll yoludur.
Fərz edək ki, sizdə bəzi elementlər haqqında müxtəlif təfərrüatlar olan bir sıra xanalar (A5:A9) var. Hansı hüceyrələrdə SKU-ların olduğunu bilmək istərdiniz. Hər bir SKU-nun 2 böyük hərf, tire və 3 rəqəmdən ibarət olduğunu fərz etsək, onları aşağıdakı ifadədən istifadə edərək uyğunlaşdıra bilərsiniz.
Nümunə : \b[A-Z]{2}-\ d{3}\b
Burada [A-Z]{2} A-dan Z-yə qədər istənilən 2 böyük hərf və \d{3} 0-dan 9-a kimi istənilən 3 rəqəm deməkdir. \b simvolu sözü bildirir sərhəd, yəni SKU ayrıca sözdür və 23-MAR-2022 kimi daha böyük sətirin bir hissəsi deyil.
Qeyd edilmiş nümunə ilə biz düstur yazmağa davam edə bilərik. Əslində, fərdi funksiyadan istifadə yerli funksiyadan fərqlənmir. Düsturu yazmağa başlayan kimi funksiyanın adı Excel-in Avtomatik Tamamlama proqramı tərəfindən təklif olunan siyahıda görünəcək. Bununla belə, Dynamic Array Excel (Microsoft 365 və Excel 2021) və ənənəvi Excel-də (2019 və daha köhnə versiyalar) bir neçə nüans var.
Bir xanada sətri uyğunlaşdırın
Sətri uyğunlaşdırmaq üçün bir xanada, birinci arqumentdə həmin xanaya istinad edin. İkinci arqumentdə nizamlı ifadə olmalıdır.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Nümunə mütləq istinadla ($A$2) kilidlənmiş əvvəlcədən təyin edilmiş xanada da saxlanıla bilər:
=RegExpMatch(A5, $A$2)
Düsulu birinci xanaya daxil etdikdən sonra onu bütün digər sətirlərə dartıb çəkə bilərsiniz.
Bu üsul bütün Excel versiyalarında gözəl işləyir.
Birdən çox xanadakı sətirləri eyni vaxtda uyğunlaşdırın
Birdən çox sətirləri bir düsturla uyğunlaşdırmaq üçün, birinci arqumentə diapazon arayışı daxil edin:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Dinamik massivləri dəstəkləyən Excel 365 və Excel 2021 proqramlarında bu şəkildə işləyir - düsturu birinci xanaya yazırsan, Enter düyməsini sıxırsan və düstur avtomatik olaraq aşağıdakı xanalara tökülür.
Excel 2019 və əvvəlki versiyalarda bu yalnız bir sıra xanalara daxil edilən və Ctrl + Shift + Enter düymələrini birlikdə basmaqla tamamlanan ənənəvi CSE massivi düsturu kimi işləyir.
Nömrəni uyğunlaşdırmaq üçün regex
0-dan 9-a qədər hər hansı bir rəqəmi uyğunlaşdırmaq üçün regexdəki \d simvolundan istifadə edin. Xüsusi tapşırığınızdan asılı olaraq, uyğun kəmiyyət göstəricisi əlavə edin və ya daha mürəkkəb model yaradın.
İstənilən rəqəmə uyğun gələn regex
İstənilən uzunluqdakı istənilən nömrəni uyğunlaşdırmaq üçün, / işarəsindən dərhal sonra + kəmiyyət göstəricisini qoyun. 1 və ya daha çox rəqəmdən ibarət rəqəmləri axtarmağı bildirən d simvolu.
Nümunə : \d+
=RegExpMatch(A5:A9, "\d+")
Xüsusi uzunluq sayına uyğun regex
Məqsədiniz müəyyən sayda rəqəmləri ehtiva edən rəqəmli dəyərləri uyğunlaşdırmaqdırsa, müvafiq kəmiyyət göstəricisi ilə birlikdə \d istifadə edin.
Məsələn, tam 7 rəqəmdən ibarət faktura nömrələrini uyğunlaşdırmaq üçün \d{7} istifadə edərdiniz. Bununla belə, 7-yə uyğunlaşacağını unutmayıngözlənildiyi kimi:
Qeydlər:
- Beynəlxalq kodlar yoxlanılmır, ona görə də onlar mövcud və ya olmaya bilər.
- Normal ifadələrdə \s boşluq, tab, karetanın qaytarılması və ya yeni sətir kimi istənilən boşluq simvolunu ifadə edir. Yalnız boşluqlara icazə vermək üçün [-\] istifadə edin. ] əvəzinə [-\.\s].
- [^13] 1 və ya 3 olmayan hər hansı bir simvola uyğun olacaq.
- [^1-3] 1 olmayan hər hansı bir simvola uyğun olacaq, 2 və ya 3 (yəni 1-dən 3-ə qədər istənilən rəqəm).
- Yuxarıdakı regex yalnız tək sətirli sətirləri üçün işləyir. Milti-sətir sətirlərində ^ və $ simvolları giriş sətirinin əvvəli və sonu əvəzinə hər sətirin əvvəli və sonuna uyğun gəlir, buna görə də regex yalnız birinci sətirdə axtarış aparır.
- başlamayan müəyyən mətnlə uyğunlaşdırmaq üçün ^(?!limons).*$
- kimi müntəzəm ifadədən istifadə edin. bitməyən müəyyən mətnlə uyğunlaşdırmaq üçün daxil edinson sətir axtarış modelinə lövbər salır: ^((?!lemons$).)*$
Rəqex simvolu UYĞUN ETMƏYƏK
Müəyyən simvolu ehtiva etməyən sətirləri tapmaq üçün uyğun gələn inkar edilmiş simvol siniflərindən [^ ] istifadə edə bilərsiniz. mötərizədə DEYİL heç nə. Məsələn:
Telefon nömrələri siyahısında ölkə kodu olmayanları tapmaq istədiyinizi düşünək. İstənilən beynəlxalq kodun + işarəsini ehtiva etdiyini nəzərə alaraq, plus işarəsi olmayan sətirləri tapmaq üçün [^\+] simvol sinfindən istifadə edə bilərsiniz. Yuxarıdakı ifadənin + olmayan hər hansı bir simvola uyğun olduğunu başa düşmək vacibdir. Telefon nömrəsi sətirin hər hansı yerində ola bildiyindən, hər bir sonrakı simvolu yoxlamaq üçün * kəmiyyət göstəricisi əlavə edilir. Başlanğıc ^ və son $ lövbərləri bütün sətirin işlənməsini təmin edir. Nəticədə, "sətirdəki heç bir mövqedə + simvoluna uyğun gəlmir" deyən aşağıdakı müntəzəm ifadəni alırıq.
Nümunə :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
Sətrə UYĞUN ETMƏK ÜÇÜN regex
Baxmayaraq ki, üçün xüsusi normal ifadə sintaksisi yoxdur. xüsusi sətirlə uyğun gəlmirsə, mənfi baxışdan istifadə edərək bu davranışı təqlid edə bilərsiniz.
Fərz edək ki, siz tərkibində "limon" sözünü olmayan sətirləri tapmaq istəyirsiniz. Bu nizamlı ifadə işləyəcək:
Nümunə : ^((?!limonlar).)*$
Aydındır ki, burada bəzi izahatlara ehtiyac var. Mənfi baxış (?!limonlar) qarşıda heç bir "limon" sözünün olub olmadığını görmək üçün sağa baxır. Əgər "limonlar" yoxdursa, o zaman nöqtə xətt kəsilməsi istisna olmaqla istənilən simvola uyğun gəlir. Yuxarıdakı ifadə yalnız bir yoxlama yerinə yetirir və * kəmiyyət göstəricisi ^ ilə bağlanmış sətirin əvvəlindən $ ilə bağlanmış sətirin sonuna qədər onu sıfır və ya daha çox dəfə təkrarlayır.
Mətn registrinə məhəl qoymamaq üçün, funksiyamızı böyük hərflərə həssas etmək üçün 3-cü arqumenti FALSE olaraq təyin etdik:
=RegExpMatch(A5, $A$2, FALSE)
Məsləhətlər və qeydlər:
Hərflərə həssas olmayan uyğunluq
Klassik normal ifadələrdə xüsusi nümunə var VBA RegExp-də dəstəklənməyən hərflərə həssas olmayan uyğunluq (?i). Bu məhdudiyyəti aradan qaldırmaq üçün bizim fərdi funksiyamız match_case adlı 3-cü əlavə arqumenti qəbul edir. Hərfi-həssas olmayan uyğunlaşdırma etmək üçün sadəcə onu YANLIŞ olaraq təyin edin.
Tutaq ki, 1 mart və ya 01 mart 2022-ci il kimi tarixləri müəyyən etmək istəyirsiniz. dd-aaa-yyyy və d-aaa-yy formatlarını uyğunlaşdırmaq üçün biz aşağıdakı normal ifadədən istifadə edirik.
Nümunə : \b\d{1,2}-(Yanvar10 rəqəmli və ya 100 rəqəmli nömrə daxil olmaqla sətirdə istənilən yerdə rəqəmlər. Əgər axtardığınız bu deyilsə, hər iki tərəfə \b sözünün sərhəddini qoyun.
Nümunə : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Telefon nömrələrini uyğunlaşdırmaq üçün regex
Telefon nömrələri müxtəlif formatlarda yazıla bildiyi üçün onlara uyğunluq daha mürəkkəb nizamlı ifadə tələb edir.
Aşağıdakı verilənlər bazasında biz ilk 2 qrupda 3, sonuncu qrupda 4 rəqəmi olan 10 rəqəmli ədədləri axtaracağıq. Qruplar nöqtə, tire və ya boşluqla ayrıla bilər. Birinci qrup mötərizə içərisində ola bilər və ya olmaya da bilər.
Nümunə: (\(\d{3}\)