Mundarija
Ushbu qo'llanmada siz Excelda berilgan naqshga mos keladigan pastki qatorlarni topish va chiqarish uchun oddiy iboralardan qanday foydalanishni o'rganasiz.
Microsoft Excel matnni ajratib olish uchun bir qator funksiyalarni taqdim etadi. hujayralardan. Ushbu funktsiyalar sizning ish varaqlaringizdagi qatorlarni chiqarish muammolarining ko'pchiligini engishi mumkin. Ko'pchilik, lekin hammasi emas. Matn funksiyalari qoqilganda, oddiy iboralar yordamga keladi. Kutib turing… Excelda RegEx funksiyalari yo'q! To'g'ri, o'rnatilgan funktsiyalar yo'q. Lekin o'zingiznikidan foydalanishingizga hech narsa to'sqinlik qilmaydi :)
Stringlarni chiqarish uchun Excel VBA Regex funksiyasi
Excelga maxsus Regex Extract funksiyasini qo'shish uchun, quyidagi kodni VBA muharririga joylashtiring. VBA'da muntazam ifodalarni yoqish uchun biz o'rnatilgan Microsoft RegExp ob'ektidan foydalanmoqdamiz.
Umumiy funktsiya RegExpExtract(matn sifatida String , shablon sifatida String , ixtiyoriy instance_num as Integer = 0, ixtiyoriy match_case As Boolean = True ) Dim text_matches() As String Dim matches_index As Integer On Error GoTo ErrHandl RegExpExtract = "" Belgilang regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = naqsh regex.Global = Haqiqiy regex.MultiLine = rost bo'lsa, rost = regex. ignorecase = False Else regex.ignorecase = True End Agar to'siq mos kelsa = regex.Execute(matn) Agar 0 < matches.Count Keyin If (0 = instance_num) Keyin ReDim text_matches(matches.Count - 1, 0) matches_index = 0 ToVBA RegExp, men sizni yanada kuchliroq .NET Regex funksiyalari haqida gapiradigan keyingi qismni o'qishni taklif qilaman.Excel'da matn chiqarish uchun .NET-ga asoslangan maxsus Regex funksiyasi
VBA RegExp funksiyalaridan farqli o'laroq. har qanday Excel foydalanuvchisi tomonidan yozilishi mumkin, .NET RegEx dasturchi sohasi. Microsoft .NET Framework Perl 5 bilan mos keladigan to'liq xususiyatli muntazam ifoda sintaksisini qo'llab-quvvatlaydi. Ushbu maqola sizga bunday funktsiyalarni qanday yozishni o'rgatmaydi (men dasturchi emasman va buni qanday qilish haqida zarracha tasavvurga ega emasman :)
Standart .NET RegEx mexanizmi tomonidan qayta ishlangan to'rtta kuchli funksiya allaqachon ishlab chiquvchilarimiz tomonidan yozilgan va Ultimate Suite-ga kiritilgan. Quyida biz Excelda matn chiqarish uchun maxsus ishlab chiqilgan funksiyadan amaliy foydalanishni ko'rsatamiz.
Maslahat. .NET Regex sintaksisi haqida ma'lumot olish uchun .NET Regular Expression Language ga qarang.
Oddiy iboralar yordamida Excelda stinglarni qanday chiqarish mumkin
Ultimate Suite-ning eng so'nggi versiyasi o'rnatilgan deb hisoblasak, oddiy iboralar yordamida matnni chiqarish quyidagi ikki bosqichga to'g'ri keladi:
- Ablebits Data yorlig'ida, Matn guruhida Regex Tools -ni bosing.
- Regex Tools panelida manba ma'lumotlarini tanlang, Regex naqshingizni kiriting va Extract opsiyasini tanlang. Natijani qiymat emas, balki maxsus funksiya sifatida olish uchun Formula sifatida kiritish belgisini tanlangquti. Tugallangach, Extract tugmasini bosing.
Natijalar asl ma'lumotlaringizning o'ng tomonidagi yangi ustunda paydo bo'ladi:
AblebitsRegexExtract sintaksisi
Bizning maxsus funksiyamiz quyidagi sintaksisga ega:
AblebitsRegexExtract(ma'lumotnoma, muntazam_ifoda)Bu erda:
- Ma'lumotnoma (zarur) - manba qatorini o'z ichiga olgan katakka havola.
- Oddiy_ifoda (majburiy) - mos keladigan regex naqsh.
Muhim eslatma! Funksiya faqat Ultimate Suite for Excel oʻrnatilgan mashinalarda ishlaydi.
Foydalanish boʻyicha eslatmalar
Oʻrganish egri chizigʻingizni silliqroq qilish va tajribangizni yanada qiziqarli qilish uchun quyidagi fikrlarga eʼtibor bering:
- Formula yaratish uchun siz bizning Regex Tools yoki Excelning Funktsiyani qo'shish dialog oynasidan foydalanishingiz yoki hujayraga to'liq funksiya nomini kiritishingiz mumkin. Formula kiritilgandan so'ng, siz uni har qanday mahalliy formulalar kabi boshqarishingiz (tahrirlashingiz, nusxalashingiz yoki ko'chirishingiz) mumkin.
- Regex Tools paneliga kiritilgan naqsh 2-argumentga o'tadi. Muntazam ifodani alohida katakchada saqlash ham mumkin. Bunday holda, faqat 2-argument uchun hujayra havolasidan foydalaning.
- Funksiya birinchi topilgan moslikni chiqaradi.
- Sukut boʻyicha, funksiya rejim boʻladi. -sezgir . Katta-kichik harflarga mos kelmaslik uchun (?i) naqshidan foydalaning.
- Agar moslik topilmasa, #N/A xatosi boʻladi.qaytarildi.
Ikki belgi orasidagi satrni ajratib olish uchun regex
Ikki belgi orasidagi matnni olish uchun siz suratga olish guruhi yoki atrofga qarashdan foydalanishingiz mumkin.
Keling, Qavslar orasiga matn chiqarmoqchi ekanligingizni ayting. Guruhni suratga olish eng oson yo'ldir.
1-rasm : \[(.*?)\]
Orqaga va oldinga ijobiy qarash bilan natija aniq bo'ladi. xuddi shunday.
2-rasm : (?<=\[)(.*?)(?=\])
E'tibor bering, bizning suratga olish guruhimiz (.*?) ikki qavs orasidagi matn uchun dangasa qidiruvni amalga oshiradi - birinchi [dan birinchi ]gacha. Savol belgisi (.*) bo'lmagan qo'lga olish guruhi ochko'z qidiruvni amalga oshiradi va birinchi [ dan oxirgi ]gacha hamma narsani qo'lga kiritadi.
A2 formatidagi naqsh bilan formula quyidagicha bo'ladi. quyidagicha:
=AblebitsRegexExtract(A5, $A$2)
Barcha mosliklarni qanday olish mumkin
Yuqorida aytib o'tganimizdek, AblebitsRegexExtract funktsiyasi faqat bitta o'yinni chiqarishi mumkin. Barcha mosliklarni olish uchun siz avvalroq muhokama qilgan VBA funksiyasidan foydalanishingiz mumkin. Biroq, bitta ogohlantirish bor - VBA RegExp guruhlarni qo'lga kiritishni qo'llab-quvvatlamaydi, shuning uchun yuqoridagi naqsh "chegara" belgilarini, bizning holatlarimizda qavslarni ham qaytaradi.
=TEXTJOIN(" ", TRUE, RegExpExtract(A5, $A$2))
Qutilish uchun. Qavslarni quyidagi formuladan foydalanib bo'sh satrlar ("") bilan ALSHIRING:
=SUBSTITUTE(SUBSTITUTE(TEXTJOIN(", ", TRUE, RegExpExtract(A5, $A$2)), "]", ""),"[","")
Yaxshiroq o'qilishi uchun ajratuvchi uchun verguldan foydalanamiz.
Ikki satr orasidagi matnni ajratib olish uchun regex
Biz ishlagan yondashuvso'zma-so'z talqin qiling).
A2 formatida qaysi muntazam ifoda kiritilganiga qarab, quyidagi formula turli natijalar beradi:
=AblebitsRegexExtract(A5, $A$2)
Regex to'liq domen nomini barcha subdomenlar bilan ajratib olish uchun:
Subdomensiz ikkinchi darajali domenni chiqarish uchun regex:
Mana shunday oddiy iboralar yordamida Excelda matn qismlarini ajratib olish mumkin. O'qiganingiz uchun rahmat va sizni keyingi hafta blogimizda ko'rishni orziqib kutaman!
Mavjud yuklab olishlar
Excel Regex Extract misollari (.xlsm fayli)
Ultimate Suite sinov versiyasi (.exe fayli)
\b(0?[0-9]matches.Count - 1 text_matches(matches_index, 0) = matches.Item(matches_index) Keyingi matches_index RegExpExtract = text_matches Aks holda RegExpExtract = matches.Item(instance_num - 1) Agar tugasa, Chiqish funksiyasi ErrHandl: RegExprExtractx = CVErVrVr.Agar sizda VBA bilan tajribangiz kam bo'lsa, bosqichma-bosqich foydalanuvchi qo'llanmasi foydali bo'lishi mumkin: VBA kodini Excelga qanday kiritish kerak.
Eslatma. Funktsiya ishlashi uchun faylingizni makros-yoqilgan ish kitobi (.xlsm) sifatida saqlang.
RegExpExtract sintaksisi
RegExpExtract funktsiyasi kirish satrida muntazam ifodaga mos keladigan qiymatlarni qidiradi va bir yoki barcha mosliklarni chiqaradi.
Funktsiya quyidagi sintaksisga ega. :
RegExpExtract(matn, naqsh, [namuna_num], [match_case])Bu yerda:
- Matn (majburiy) - qidiruv uchun matn qatori.
- Pattern (majburiy) - mos keladigan muntazam ifoda. To'g'ridan-to'g'ri formulada taqdim etilganda, naqsh qo'sh tirnoq belgilariga olinishi kerak.
- Instance_num (ixtiyoriy) - qaysi misolni chiqarish kerakligini ko'rsatadigan seriya raqami. Agar o'tkazib yuborilsa, barcha topilgan mosliklarni qaytaradi (standart).
- Match_case (ixtiyoriy) - matn registriga mos kelishi yoki e'tibor bermaslik kerakligini belgilaydi. 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.
Funktsiya Excel 365, Excel 2021, Excelning barcha versiyalarida ishlaydi.2019, Excel 2016, Excel 2013 va Excel 2010.
RegExpExtract haqida bilishingiz kerak bo'lgan 4 ta narsa
Funksiyadan Excel-da samarali foydalanish uchun bir nechta muhim narsalarga e'tibor berish kerak:
- Sukut bo'yicha, funksiya ushbu misolda ko'rsatilganidek, qo'shni hujayralarga barcha topilgan mosliklarni qaytaradi. Muayyan hodisani olish uchun namuna_num argumentiga mos keladigan raqamni kiriting.
- Sukut bo'yicha, funksiya katta-kichik harflarga sezgir . Katta-kichik harflarga mos kelmaslik uchun match_case argumentini FALSE qilib belgilang. VBA cheklovlari tufayli katta-kichik harfni sezmaydigan konstruksiya (?i) ishlamaydi.
- Agar yaroqli naqsh topilmasa , funksiya hech narsani qaytarmaydi (boʻsh qator).
- Agar naqsh noto'g'ri bo'lsa , #VALUE! xatolik yuz berdi.
Ushbu maxsus funksiyadan ish varaqlarida foydalanishni boshlashdan oldin, u nimaga qodirligini tushunishingiz kerak, to'g'rimi? Quyidagi misollar bir nechta umumiy foydalanish holatlarini qamrab oladi va nima uchun Dynamic Array Excel (Microsoft 365 va Excel 2021) va an'anaviy Excel (2019 va undan eski versiyalari) da xatti-harakatlar farq qilishi mumkinligi tushuntiriladi.
Eslatma. Oddiy ma'lumotlar to'plamlari uchun regex misollari yozilgan. Ular sizning haqiqiy ish varaqlaringizda benuqson ishlashiga kafolat bera olmaymiz. Regex bilan tajribaga ega bo'lganlar, muntazam iboralarni yozish mukammallikka olib boradigan cheksiz yo'l ekanligiga rozi bo'lishadi - deyarli har doim qilishning bir yo'li bor.u yanada oqlangan yoki kengroq kirish ma'lumotlarini boshqarishga qodir.
Stringdan raqamni ajratib olish uchun regex
Oddiydan murakkabga oʻrgatishning asosiy maksimiga amal qilgan holda, biz juda oddiy holatdan boshlaymiz: satrdan raqam chiqarish.
Siz qaror qilishingiz kerak bo'lgan birinchi narsa - qaysi raqamni olish kerak: birinchi, oxirgi, aniq hodisa yoki barcha raqamlar.
Birinchi raqamni chiqarib oling
Bu regex olishi mumkin bo'lgan darajada oddiy. \d 0 dan 9 gacha bo'lgan har qanday raqamni va + bir yoki bir necha martani bildirishini hisobga olsak, bizning oddiy iboramiz quyidagi shaklni oladi:
Naqsh : \d+
Set instance_num dan 1 gacha va siz kerakli natijaga erishasiz:
=RegExpExtract(A5, "\d+", 1)
Bu yerda A5 asl satrdir.
Qulaylik uchun kiritishingiz mumkin oldindan belgilangan katakdagi naqsh ($A$2 ) va uning manzilini $ belgisi bilan qulflang:
=RegExpExtract(A5, $A$2, 1)
Oxirgi raqamni olish
Stringdagi oxirgi raqamni chiqarish uchun , foydalanish uchun namuna:
Naqsh : (\d+)(?!.*\d)
Inson tiliga tarjima qilingan , unda shunday deyilgan: boshqa raqamdan keyin (hech bir joyda, darhol emas) raqamni toping. Buni ifodalash uchun biz salbiy koʻrinishdan (?!.*\d) foydalanmoqdamiz, yaʼni naqshning oʻng tomonida uning oldida qancha belgilar boʻlishidan qatʼiy nazar, boshqa raqam (\d) boʻlmasligi kerak.
=RegExpExtract(A5, "(\d+)(?!.*\d)")
Maslahatlar:
- Muayyan hodisani olish uchun naqsh va tegishli seriya uchun \d+ dan foydalaning misol_num uchun raqam.
- barcha raqamlarni chiqarish formulasi keyingi misolda muhokama qilinadi.
Barcha mosliklarni chiqarish uchun regex
Misolimizni biroz oldinga suradigan bo'lsak, siz bitta satrdan emas, balki barcha raqamlarni olishni xohlaysiz deylik.
Esingizda bo'lsa, ajratilgan mosliklar soni ixtiyoriy <1 tomonidan boshqariladi>instance_num argumenti. Standart barcha moslikdir, shuning uchun siz ushbu parametrni o'tkazib yuborasiz:
=RegExpExtract(A2, "\d+")
Formula bitta yacheyka uchun juda yaxshi ishlaydi, ammo Dynamic Array Excel va dinamik bo'lmagan versiyalarda xatti-harakatlar farqlanadi.
Excel 365 va Excel 2021
Dinamik massivlarni qoʻllab-quvvatlash tufayli oddiy formula avtomatik ravishda barcha hisoblangan natijalarni koʻrsatish uchun kerak boʻlganda shuncha yacheyka ichiga tushadi. Excel nuqtai nazaridan, bu to'kilgan diapazon deb ataladi:
Excel 2019 va undan pastroq
Predinamik Excelda yuqoridagi formula faqat bitta moslikni qaytaradi. Bir nechta moslikni olish uchun uni massiv formulasiga aylantirishingiz kerak. Buning uchun bir qator katakchalarni tanlang, formulani kiriting va uni yakunlash uchun Ctrl + Shift + Enter tugmalarini bosing.
Ushbu yondashuvning salbiy tomoni "qo'shimcha katakchalarda" paydo bo'ladigan #N/A xatolar to'plamidir. . Afsuski, bu haqda hech narsa qilish mumkin emas (IFERROR ham, IFNA ham buni tuzata olmaydi, afsuski).
Barcha mosliklarni bitta katakchadan chiqarib oling
Ma'lumotlar ustunini qayta ishlashda yuqoridagi yondashuv ishlamasligi aniq. Bunday holda, ideal echimbitta hujayradagi barcha o'yinlarni qaytaradi. Buni amalga oshirish uchun RegExpExtract natijalarini TEXTJOIN funksiyasiga taqdim eting va ularni o'zingizga yoqqan ajratuvchi bilan ajrating, vergul va bo'sh joyni ayting:
=TEXTJOIN(", ", TRUE, RegExpExtract(A5, "\d+"))
Eslatma. TEXTJOIN funksiyasi faqat Microsoft 365, Excel 2021 va Excel 2019 uchun Excelda mavjud bo‘lgani uchun formula eski versiyalarda ishlamaydi.
Matnni satrdan chiqarish uchun regex
Matnni ajratib olish alfanumerik satr Excelda juda qiyin vazifadir. Regex bilan bu pirog kabi oson bo'ladi. Raqam bo'lmagan hamma narsaga mos kelish uchun faqat inkor qilingan sinfdan foydalaning.
Naqsh : [^\d]+
Alohida hujayralardagi pastki qatorlarni olish uchun (to'kilmasin diapazoni) , formula:
=RegExpExtract(A5, "[^\d]+")
Barcha mosliklarni bitta katakka chiqarish uchun TEXTJOIN-ga RegExpExtract funksiyasini shunday joylashtiring:
=TEXTJOIN("", TRUE, RegExpExtract(A5, "[^\d]+"))
Regex-ni elektron pochta manzilini satrdan chiqarib olish
Koʻp turli maʼlumotlarni oʻz ichiga olgan elektron pochta manzilini chiqarish uchun elektron pochta manzili tuzilishini takrorlaydigan oddiy iborani yozing.
Naqsh : [\w\.\-]+@[A-Za-z0-9\.\-]+\.[A-Za-z]{2,24}
Ushbu regexni parchalash , biz nimaga erishamiz:
- [\w\.\-]+ 1 yoki undan ortiq alfanumerik belgilar, pastki chiziq, nuqta va defisni o'z ichiga olishi mumkin bo'lgan foydalanuvchi nomi.
- @ belgisi.
- [A-Za-z0-9\.\-]+ domen nomi: katta va kichik harflar, raqamlar, defis va nuqtalardan iboratsubdomenlar). Bu yerda pastki chiziqqa ruxsat berilmaydi, shuning uchun har qanday harf, raqam yoki pastki chiziqqa mos keladigan \w oʻrniga 3 xil belgilar toʻplami (A-Z a-z va 0-9 kabi) ishlatiladi.
- \.[A-Za-z ]{2,24} — yuqori darajadagi domen. Nuqtadan keyin katta va kichik harflardan iborat. Yuqori darajali domenlarning ko'pchiligi 3 harfdan iborat (masalan, .com .org, .edu va boshqalar), lekin nazariy jihatdan u 2 dan 24 gacha harflarni o'z ichiga olishi mumkin (eng uzun ro'yxatga olingan TLD).
String A5da va naqsh A2da bo'lsa, elektron pochta manzilini chiqarish formulasi quyidagicha bo'ladi:
=RegExpExtract(A5, $A$2)
E-pochtadan domenni ajratib olish uchun regex
Bu qachon Elektron pochta domenini ajratib olish haqida gap ketganda, aqlga kelgan birinchi fikr bu @ belgisidan keyin keladigan matnni topish uchun suratga olish guruhidan foydalanish.
Naqsh : @([A-Za-z0 -9\.\-]+\.[A-Za-z]{2,24})
Uni RegExp funksiyamizga xizmat qiling:
=RegExpExtract(A5, "@([A-Za-z0-9\.\-]+\.[A-Za-z]{2,24})")
Va siz quyidagi natijaga erishasiz:
Klassik muntazam iboralar bilan tortib olish guruhidan tashqaridagi hech narsa ekstraktsiyaga kiritilmaydi. Hech kim VBA RegEx nima uchun boshqacha ishlashini bilmaydi va "@" ni ham ushlaydi. Undan xalos bo'lish uchun natijadan birinchi belgini bo'sh qatorga almashtirish orqali olib tashlashingiz mumkin.
=REPLACE(RegExpExtract(A5, "@([a-z\d][a-z\d\-\.]*\.[a-z]{2,})", 1, FALSE), 1, 1, "")
Telefon raqamlarini chiqarish uchun oddiy ibora
Telefon raqamlari turli yo'llar bilan yozilishi mumkin, shuning uchun hamma narsada ishlaydigan yechim topish deyarli mumkin emas(\d{4}dan
Sanani ajratib olish uchun odatiy ibora sana satr ichida qaysi formatda paydo bo'lishiga bog'liq. Masalan:
1/1/21 yoki 01/01/2021 kabi sanalarni chiqarish uchun regex: \d{1,2}\/\d{1,2}\/(\d) {4}holatlar. Shunga qaramay, siz ma'lumotlar to'plamida foydalanilgan barcha formatlarni yozib olishingiz va ularni moslashtirishga harakat qilishingiz mumkin.
Ushbu misol uchun biz ushbu formatlarning istalganida telefon raqamlarini chiqaradigan regex yaratmoqchimiz:
(123) 345-6789 (123) 345 6789 (123)3456789 123- 345-6789 | 123.345.6789 123 345 6789 1233456789 |
Naqsh : \(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b
- Birinchi qism \(?\d{3} nol yoki bitta ochiladigan qavsdan keyin uchta raqam d{3} bilan mos keladi.
- [-\. \)]* qismi kvadrat qavs ichida 0 yoki undan koʻp marta koʻrinadigan har qanday belgini bildiradi: defis, nuqta, boʻsh joy yoki yopish qavs.
- Keyin bizda yana uchta raqam bor d{3} va undan keyin. har qanday chiziqcha, nuqta yoki bo'sh joy [-\. ]? 0 yoki 1 marta paydo bo'ladi.
- Bundan so'ng, to'rtta raqamdan iborat \d{4} guruhi mavjud.
- Nihoyat, biz telefon raqami ekanligimizni belgilovchi so'z chegarasi \b mavjud. Qidiruv kattaroq raqamning bir qismi bo'lishi mumkin emas.
To'liq formula quyidagi shaklni oladi:
=RegExpExtract(A5, "\(?\d{3}[-\. \)]*\d{3}[-\. ]?\d{4}\b")
Yuqoridagi regex bir nechtasini qaytarishi mumkinligini yodda tuting. 123) 456 7899 yoki (123 456 7899) kabi noto‘g‘ri ijobiy natijalar. Quyidagi versiya bu muammolarni tuzatadi. Biroq, bu sintaksis klassik oddiy iboralarda emas, faqat VBA RegExp funksiyalarida ishlaydi.
Naqsh : (\(\d{3}\)ikki belgi orasidagi matnni chiqarib olish uchun ham ikkita satr orasidagi matnni ajratib olish uchun ishlaydi.
Masalan, "test 1" va "test 2" o'rtasidagi hamma narsani olish uchun quyidagi oddiy iboradan foydalaning.
Naqsh : test 1(.*?)test 2
Toʻliq formula:
=AblebitsRegexExtract(A5, "test 1(.*?)test 2")
URL dan domenni ajratib olish uchun regex
Hatto oddiy iboralar bilan ham, URL-manzillardan domen nomlarini ajratib olish ahamiyatsiz ish emas. Hiyla-nayrangni amalga oshiradigan asosiy element guruhlarni ushlamaslikdir. Yakuniy maqsadingizga qarab, quyidagi regexlardan birini tanlang.
toʻliq domen nomini , shu jumladan pastki domenlar
Naqsh olish uchun: (?: https?\: