Excel Regex: oddiy iboralar yordamida satrlarni moslashtirish

  • Buni Baham Ko'Ring
Michael Brown

Ushbu qo'llanmada biz Excelda satrlarni moslashtirish uchun regexdan qanday foydalanishni chuqur ko'rib chiqamiz.

Qanday diapazonda ma'lum qiymatni topish kerak bo'lsa. Hujayralarning soni uchun siz MATCH yoki XMATCH funksiyasidan foydalanasiz. Hujayradan ma'lum bir qatorni qidirishda FIND va SEARCH funksiyalari yordam beradi. Va hujayrada berilgan naqshga mos keladigan ma'lumot mavjudligini qanday bilasiz? Shubhasiz, muntazam iboralar yordamida. Ammo Excel regexlarni qo'llab-quvvatlamaydi! Xavotir olmang, biz uni majburlaymiz :)

    Excel VBA Regex funktsiyasi satrlarni moslashtirish uchun

    Sarlavhadan ko'rinib turibdiki, oddiy iboralarni ishlatish uchun Excelda siz o'zingizning funksiyangizni yaratishingiz kerak. Yaxshiyamki, Excel VBA-da o'rnatilgan RegExp ob'ekti mavjud bo'lib, uni quyida ko'rsatilgandek kodingizda ishlatishingiz mumkin:

    Umumiy funktsiya RegExpMatch (input_diapazoni diapazon sifatida, shablon String sifatida, ixtiyoriy match_case As Boolean = True ) As Variant Dim arRes() Natijalarni saqlash uchun Variant massivi sifatida Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'manba diapazonidagi joriy qator indeksi, manba diapazonidagi joriy ustun indeksi, qatorlar soni, soni ustunlar On Xato GoTo ErrHandl RegExpMatch = arRes O'rnatish regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = naqsh regex.Global = True regex.MultiLine = True Agar rost bo'lsa = match_case Keyin regex.ignorecase = False Elignore. Oxiriifodalar.

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

    Bu yerda nimalar bo‘layotganini yaxshiroq tushunish uchun keling, har bir qismni batafsil ko‘rib chiqaylik :

    • Foydalanuvchi nomi harflar, raqamlar, pastki chiziq, nuqta va defislarni o'z ichiga olishi mumkin. \w har qanday harf, raqam yoki pastki chiziqqa mos kelishini yodda tutib, biz quyidagi regexni olamiz: [\w\.\-]+
    • Domen nomi katta va kichik harflarni o'z ichiga olishi mumkin, raqamlar, defislar (lekin birinchi yoki oxirgi holatda emas) va nuqtalar (subdomainlar bo'lsa). Pastki chiziqqa ruxsat berilmagani uchun \w o'rniga biz 3 xil belgilar to'plamidan foydalanamiz: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
    • Yuqori darajali domen nuqtadan keyin bosh va kichik harflardan iborat. U 2 dan 24 gacha harflardan iborat bo'lishi mumkin (hozirda mavjud bo'lgan eng uzun TLD): \.[A-Za-z]{2,24}

    Eslatma. Shakl domen nomi 2 yoki undan ortiq alfanumerik belgilarni o'z ichiga oladi.

    A5 formatidagi asl matn va A5 formatidagi naqsh bilan formula quyidagi shaklni oladi:

    =RegExpMatch(A5, $A$2)

    Yoki oddiyroq oddiy matndan foydalanishingiz mumkin. kichik yoki katta harflar majmuasi bilan elektron pochtani tekshirish uchun ifoda:

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

    Ammo formulangizni katta-kichik harflarga sezgir boʻlmang:

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

    Regexga mos keladigan Excel IF formulasi

    O'rnatilgan va moslashtirilganligi sabablifunksiyalar yaxshi ishlaydi, ularni bitta formulada birgalikda ishlatishingizga hech narsa xalaqit bermaydi.

    Agar muntazam ifoda mos kelsa, biror narsani qaytarish yoki hisoblash uchun, agar u mos kelmasa, boshqa narsani qaytarish uchun maxsus RegExpMatch-ni joylashtiring. IF ning mantiqiy matnidagi funksiya:

    IF(RegExpMatch(…), [qiymat_agar_true], [value_agar_false])

    Masalan, agar A5 qatorida to'g'ri elektron pochta manzili bo'lsa, siz "Ha" deb qaytarishingiz mumkin; aks holda "Yo'q".

    =IF(RegExpMatch(A5, $A$2,), "Yes", "No")

    Agar regex mos bo'lsa, hisoblang

    Chunki Excelning mahalliy funktsiyalari oddiy iboralarni qo'llab-quvvatlamaydi, bu COUNTIS yoki COUNTIFS funksiyasiga regexni to'g'ridan-to'g'ri qo'yish mumkin emas. Yaxshiyamki, siz bizning maxsus funksiyamizdan foydalanib, ushbu funksiyani taqlid qilishingiz mumkin.

    Aytaylik, siz telefon raqamlarini moslashtirish va natijalarni B ustuniga chiqarish uchun regexdan foydalandingiz. Qancha katakchada telefon raqamlari borligini bilish uchun sizga shunchaki kerak bo'ladi. B5:B9 da TRUE qiymatlarni hisoblash uchun. Va buni standart COUNTIF formulasi yordamida osonlik bilan amalga oshirish mumkin:

    =COUNTIF(B5:B9, TRUE)

    Ish varaqingizda qo'shimcha ustunlar bo'lishini xohlamaysizmi? Muammo yo'q. Bizning maxsus funksiyamiz bir vaqtning o‘zida bir nechta katakchalarni qayta ishlashini va Excelning SUM qiymati massivdagi qiymatlarni qo‘shishi mumkinligini yodda tutgan holda, siz quyidagi amallarni bajarasiz:

    • RegExpMatch diapazoniga havolani taqdim eting, shuning uchun u TRUE va FALSE qiymatlari massivi.
    • Mantiqiy qiymatlarni birlarga majburlash uchun ikki tomonlama inkordan (--) foydalaning.nol.
    • Natijadagi massivda 1 va 0 larni qo'shish uchun SUM funksiyasini oling.

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

    Regeks moslashuvi Ultimate Suite bilan

    Ultimate Suite foydalanuvchilari to'rtta kuchli Regex funksiyasidan ish kitoblariga hech qanday VBA kodini qo'shmasdan foydalanishlari mumkin, chunki ular plaginni o'rnatish vaqtida Excelga muammosiz integratsiyalashgan. Bizning maxsus funksiyalarimiz standart .NET RegEx mexanizmi tomonidan qayta ishlanadi va toʻliq xususiyatli klassik muntazam ifodalarni qoʻllab-quvvatlaydi.

    Maxsus RegexMatch funksiyasidan qanday foydalanish kerak

    Ultimate Suite ning eng soʻnggi versiyasi oʻrnatilgan deb hisoblasangiz ( 2021.4 yoki undan keyingi versiyalarida Regex Match formulasini ikkita oddiy qadamda yaratishingiz mumkin:

    1. Ablebits Data yorligʻida, Matn guruhidagi tugmani bosing. Regex Tools .

  • Regex Tools panelida quyidagilarni bajaring:
    • Tanlash manba satrlari.
    • Naqshni kiriting.
    • Match variantini tanlang.
    • Natijalar qiymatlar emas, formulalar boʻlishi uchun Formula sifatida kiritish katagiga belgi qo'ying.
    • Match tugmasini bosing.

    Biroz vaqt o'tgach, AblebitsRegexMatch funksiyasi ma'lumotlaringizning o'ng tomonidagi yangi ustunga kiritiladi.

    Quyidagi skrinshotda funksiya A ustunidagi satrlarda 7-raqamdan iboratligini tekshiradi. raqamlar yoki yo'q.

    Maslahatlar:

    • Funksiya tion to'g'ridan-to'g'ri katakka kiritilishi mumkinstandart Funktsiyani qo'shish dialog oynasi orqali, u erda u AblebitsUDFs ostida tasniflanadi.
    • Sukut bo'yicha formulaga muntazam ifoda qo'shiladi, lekin siz ham saqlab qo'yishingiz mumkin. u alohida hujayrada. Buning uchun faqat 2-argument uchun hujayra havolasidan foydalaning.
    • Sukut bo'yicha, funksiya katta-kichik harflarga sezgir . Katta-kichik harflarga mos kelmaslik uchun (?i) naqshidan foydalaning.

    Qo'shimcha ma'lumot olish uchun AblebitsRegexMatch funksiyasiga qarang.

    Mana shunday Excelda oddiy ifodalarni moslashtirish mumkin. O'qiganingiz uchun rahmat va sizni keyingi hafta blogimizda ko'rishni orziqib kutaman!

    Mavjud yuklab olishlar

    Excel Regex Match misollari (.xlsm fayli)

    Ultimate Suite 14- kunning to'liq ishlaydigan versiyasi (.exe fayli)

    Agar cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes (1 to cntInputRows, 1 to cntInputCols) iInputCurRow uchun = 1 cntInputRows uchun iInputCurCol uchun = 1 CntInputCiRow uchun iInputCurCol = 1 CntolCiR (cntolesturCiR) uchun .Cells(iInputCurRow, iInputCurCol).Value) Keyingi Keyingi RegExpMatch = arRes Chiqish funktsiyasi ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Kodni VBA muharririga joylashtiring va sizning yangi RegExp funksiyangiz foydalanishga tayyor. Agar siz VBA bilan unchalik tajribaga ega bo'lmasangiz, ushbu qo'llanma foydali bo'lishi mumkin: VBA kodini Excelga qanday kiritish mumkin.

    Eslatma. Kodni kiritgandan so'ng, faylingizni makros-yoqilgan ish kitobi (.xlsm) sifatida saqlashni unutmang.

    RegExpMatch sintaksisi

    RegExpMatch funktsiyasi manba satrning biron bir qismi muntazam ifodaga mos kelishini tekshiradi. Natija mantiqiy qiymatga ega bo‘ladi: agar kamida bitta moslik topilsa TRUE, aks holda FALSE.

    Bizning maxsus funksiyamizda 3 ta argument bor – birinchi ikkitasi talab qilinadi, oxirgisi esa ixtiyoriy:

    RegExpMatch(matn , naqsh, [match_case])

    Bu yerda:

    • Matn (kerak) - qidirish uchun bir yoki bir nechta satr. Yacheyka yoki diapazonga havola sifatida taqdim etilishi mumkin.
    • Pattern (majburiy) - mos keladigan muntazam ifoda. To'g'ridan-to'g'ri formulaga qo'yilsa, naqsh qo'sh tirnoq ichiga olinishi kerak.
    • Match_case (ixtiyoriy) - moslikni belgilaydituri. Agar TRUE yoki o'tkazib yuborilgan bo'lsa (standart bo'lsa), katta-kichik harflarni hisobga olgan holda moslashtirish amalga oshiriladi; agar FALSE - katta-kichik harflarni sezmasa.

    Funksiya Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 va Excel 2010 ning barcha versiyalarida ishlaydi.

    Siz uchun 3 ta narsa RegExpMatch haqida bilish kerak

    Amaliy hisob-kitoblarga kirishdan oldin ba'zi texnik jihatlarga aniqlik kirituvchi quyidagi fikrlarga e'tibor bering:

    1. Funktsiya bitta katakchani qayta ishlay oladi yoki hujayralar diapazoni . Ikkinchi holda, natijalar qo'shni kataklarga dinamik massiv yoki to'kilish diapazoni ko'rinishida qaytariladi, bu misolda ko'rsatilgandek.
    2. Sukut bo'yicha, funktsiya katta-kichik harflarga sezgir . Matn registrini e'tiborsiz qoldirish uchun match_case argumentini FALSE qilib belgilang. VBA Regexp cheklovlari tufayli katta-kichik harflarni sezmaydigan naqsh (?i) qo‘llab-quvvatlanmaydi.
    3. Agar to'g'ri naqsh topilmasa, funktsiya FALSE ni qaytaradi; agar naqsh noto'g'ri bo'lsa , #VALUE! xatolik yuz berdi.

    Quyida siz namoyish qilish uchun yaratilgan bir nechta regex moslik misollarini topasiz. Bizning naqshlarimiz haqiqiy ish varaqlaringizdagi kengroq kirish ma'lumotlari bilan xatosiz ishlashiga kafolat bera olmaymiz. Ishlab chiqarishni boshlashdan oldin namunalar namunalarimizni o'z ehtiyojlaringizga qarab sinab ko'ring va sozlang.

    Excelda satrlarni moslashtirish uchun regexdan qanday foydalanish kerak

    Agar mos kelmoqchi bo'lgan barcha satrlar mavjud bo'lsa bir xil naqsh,Muntazam iboralar ideal yechim hisoblanadi.

    Ayrim elementlar haqida turli ma'lumotlarni o'z ichiga olgan bir qator katakchalaringiz (A5:A9) mavjud. Qaysi hujayralarda SKU borligini bilishni xohlaysiz. Har bir SKU 2 ta bosh harf, chiziqcha va 3 ta raqamdan iborat deb faraz qilsangiz, ularni quyidagi ibora yordamida moslashtirishingiz mumkin.

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

    Bu yerda [A-Z]{2} A dan Z gacha boʻlgan har qanday 2 ta bosh harfni va \d{3} 0 dan 9 gacha boʻlgan 3 ta raqamni bildiradi. \b belgisi soʻzni bildiradi. chegara, ya'ni SKU alohida so'z bo'lib, 23-MAR-2022 kabi kattaroq qatorning bir qismi emas.

    O'rnatilgan naqsh bilan biz formula yozishga o'tishimiz mumkin. Aslida, maxsus funktsiyadan foydalanish mahalliy funktsiyadan farq qilmaydi. Formulani yozishni boshlaganingizdan so'ng, funktsiya nomi Excel avtomatik to'ldirish tomonidan tavsiya etilgan ro'yxatda paydo bo'ladi. Biroq, Dynamic Array Excel (Microsoft 365 va Excel 2021) va an'anaviy Excel (2019 va undan eski versiyalari) da bir nechta nuanslar mavjud.

    Bir hujayradagi satrni moslashtirish

    Stringni moslashtirish uchun bitta yacheykada birinchi argumentda ushbu katakka murojaat qiling. Ikkinchi argument muntazam ifodani o'z ichiga olishi kerak.

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

    Naqsh mutlaq havola ($A$2) bilan bloklangan oldindan belgilangan katakda ham saqlanishi mumkin:

    =RegExpMatch(A5, $A$2)

    Birinchi katakka formulani kiritganingizdan so'ng uni boshqa barcha qatorlarga tortib o'tkazishingiz mumkin.

    Ushbu usul Excelning barcha versiyalarida yaxshi ishlaydi.

    Bir vaqtning o'zida bir nechta kataklardagi satrlarni moslashtirish

    Bir formula bilan bir nechta satrlarni moslashtirish uchun, birinchi argumentda diapazonga havolani qo'shing:

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

    Dinamik massivlarni qo'llab-quvvatlaydigan Excel 365 va Excel 2021 da u shunday ishlaydi - formulani birinchi katakchaga kiritasiz, Enter tugmasini bosing va formula avtomatik ravishda quyida joylashgan katakchalarga tushadi.

    Excel 2019 va undan oldingi versiyalarida u faqat an'anaviy CSE massiv formulasi sifatida ishlaydi, u bir qator katakchalarga kiritiladi va Ctrl + Shift + Enter tugmalarini birga bosish orqali yakunlanadi.

    Raqamga mos keladigan regex

    0 dan 9 gacha bo'lgan har qanday bitta raqamni moslashtirish uchun regexdagi \d belgisidan foydalaning. Muayyan vazifangizga qarab, mos keladigan miqdorni qo'shing yoki murakkabroq naqsh yarating.

    Istalgan raqamga mos keladigan regex

    Istalgan uzunlikdagi istalgan raqamga mos kelish uchun, / belgisidan keyin + kvantini qo'ying. d belgisi, bu 1 yoki undan ortiq raqamdan iborat raqamlarni qidirishni bildiradi.

    Naqsh : \d+

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

    Ma'lum uzunlik soniga mos keladigan regex

    Agar maqsadingiz ma'lum sonli raqamlarni o'z ichiga olgan raqamli qiymatlarni moslashtirish bo'lsa, u holda tegishli kvantifikator bilan \d dan foydalaning.

    Masalan, aniq 7 ta raqamdan iborat hisob-faktura raqamlarini moslashtirish uchun \d{7} dan foydalanasiz. Biroq, 7 ga mos kelishini unutmangkutilganidek:

    Eslatmalar:

    • Xalqaro kodlar tekshirilmagan, shuning uchun ular mavjud yoki bo'lmasligi mumkin.
    • Muntazam iboralarda \s har qanday bo'sh joy belgisini bildiradi, masalan, bo'sh joy, yorliq, karetaning qaytishi yoki yangi qator. Faqat boʻsh joylarga ruxsat berish uchun [-\” dan foydalaning. ] oʻrniga [-\.\s].
    • Belgi EMAS uchun Regex

      Muayyan belgi BOʻLMAGAN satrlarni topish uchun mos keladigan inkor qilingan belgilar sinflaridan [^ ] foydalanishingiz mumkin qavs ichida YO'Q hech narsa. Masalan:

      • [^13] 1 yoki 3 bo'lmagan har qanday bitta belgiga mos keladi.
      • [^1-3] 1 bo'lmagan har qanday bitta belgiga mos keladi, 2 yoki 3 (ya'ni, 1 dan 3 gacha bo'lgan har qanday raqam).

      Telefon raqamlari ro'yxatida siz mamlakat kodi bo'lmagan raqamlarni topmoqchi bo'lsangiz, deylik. Har qanday xalqaro kodda + belgisi mavjudligini yodda tutib, ortiqcha belgisi bo'lmagan qatorlarni topish uchun [^\+] belgilar sinfidan foydalanishingiz mumkin. Yuqoridagi ifoda + bo'lmagan har qanday bitta belgiga mos kelishini tushunish muhimdir. Telefon raqami satrning istalgan joyida bo'lishi mumkinligi sababli, har bir keyingi belgini tekshirish uchun * kvantifikatori qo'shiladi. Start ^ va end $ langarlari butun satrning qayta ishlanishini ta'minlaydi. Natijada, biz quyidagi oddiy iboraga ega bo'lamiz, unda "satrning biron bir pozitsiyasida + belgisi mos kelmaydi".

      Naqsh :^[^\+]*$

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

      Regex stringga mos EMAS

      Garchi maxsus muntazam ifoda sintaksisi mavjud emas Agar ma'lum bir qatorga mos kelmasa, salbiy ko'rinishdan foydalanib, bu xatti-harakatga taqlid qilishingiz mumkin.

      Faraz, siz o'z ichiga "limon" so'zini kiritmagan qatorlarni topmoqchi bo'lsangiz. Bu muntazam ibora ishlay oladi:

      Naqsh : ^((?!limonlar).)*$

      Ochig'i, bu erda ba'zi tushuntirishlar kerak. Salbiy qarash (?!limonlar) oldinda "limon" so'zi yo'qligini bilish uchun o'ng tomonga qaraydi. Agar "limonlar" bo'lmasa, nuqta chiziqdan tashqari har qanday belgiga mos keladi. Yuqoridagi ibora faqat bitta tekshirishni amalga oshiradi va * kvantifikatori uni ^ bilan bogʻlangan satr boshidan $ bilan bogʻlangan satr oxirigacha nol yoki undan koʻp marta takrorlaydi.

      Matn registrini eʼtiborsiz qoldirish uchun, Funktsiyamizni katta-kichik harflarga sezgir bo'lmasligi uchun 3-argumentni FALSE ga o'rnatdik:

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

      Maslahatlar va eslatmalar:

      • Yuqoridagi regex faqat bir qatorli satrlar uchun ishlaydi. Milti-satrli satrlarda ^ va $ belgilari kirish qatorining boshi va oxiri o'rniga har bir satrning boshi va oxiriga mos keladi, shuning uchun regex faqat birinchi qatorda qidiradi.
      • boshlanmagan ma'lum matn bilan mos keladigan satrlarni moslashtirish uchun ^(?!limonlar) kabi oddiy iboradan foydalaning.*$
      • tugamaydigan ma'lum matn bilan mos keladigan satrlarni kiritish uchun kiritingso'nggi qatorni qidirish naqshiga bog'laydi: ^((?!lemons$).)*$

      Harf-hgizni sezgir bo'lmagan moslik

      Klassik muntazam iboralarda maxsus naqsh mavjud. VBA RegExp-da qo'llab-quvvatlanmaydigan katta-kichik harflarga mos kelish (?i). Ushbu cheklovni bartaraf etish uchun bizning maxsus funksiyamiz match_case nomli 3-ixtiyoriy argumentni qabul qiladi. Katta-kichik harflarni hisobga olmagan holda moslashtirish uchun uni FALSE qiymatiga qo‘ying.

      Aytaylik, siz 22-1-mart yoki 2022-yil 01-mart kabi sanalarni aniqlamoqchisiz. dd-mmm-yyyy va d-mmm-yy formatlarini moslashtirish uchun biz quyidagi oddiy ifodadan foydalanamiz.

      Naqsh : \b\d{1,2}-(yanvar10 yoki 100 xonali raqamni o'z ichiga olgan qatorning istalgan joyidagi raqamlar. Agar bu siz qidirayotgan narsa bo'lmasa, har ikki tomonga \b chegarasini qo'ying.

      Naqsh : \b\d{7}\b

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

      Telefon raqamlariga mos keladigan regex

      Telefon raqamlari turli formatlarda yozilishi mumkinligi sababli, ularni moslashtirish yanada murakkab muntazam ifodani talab qiladi.

      Quyidagi ma’lumotlar to‘plamida biz birinchi 2 guruhda 3 ta raqam va oxirgi guruhda 4 ta raqamga ega bo‘lgan 10 xonali raqamlarni qidiramiz. Guruhlarni nuqta, defis yoki bo'sh joy bilan ajratish mumkin. Birinchi guruh qavs ichiga olinishi yoki bo‘lmasligi mumkin.

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

    Maykl Braun - dasturiy vositalardan foydalangan holda murakkab jarayonlarni soddalashtirishga ishtiyoqi bo'lgan maxsus texnologiya ishqibozi. Texnologiya sohasida o'n yildan ortiq tajribaga ega bo'lgan holda, u Microsoft Excel va Outlook, shuningdek, Google Sheets va Docs dasturlarida o'z mahoratini oshirdi. Mayklning blogi o'z bilimi va tajribasini boshqalar bilan baham ko'rishga, samaradorlik va samaradorlikni oshirish uchun amal qilish oson maslahatlar va o'quv qo'llanmalariga bag'ishlangan. Tajribali mutaxassismisiz yoki yangi boshlovchi boʻlasizmi, Mayklning blogi ushbu muhim dasturiy vositalardan maksimal darajada foydalanish uchun qimmatli tushunchalar va amaliy maslahatlarni taqdim etadi.