Мазмұны
Бұл оқулықта біз Excel бағдарламасындағы жолдарды сәйкестендіру үшін regex сөзін пайдалану жолын тереңірек қарастырамыз.
Ауқымнан белгілі бір мәнді табу қажет болғанда. ұяшықтар үшін SATCH немесе XMATCH функциясын қолданасыз. Ұяшықтан белгілі бір жолды іздегенде, FIND және SEARCH функциялары ыңғайлы болады. Ал ұяшықта берілген үлгіге сәйкес ақпарат бар-жоғын қалай білуге болады? Әлбетте, тұрақты өрнектерді қолдану арқылы. Бірақ Excel бағдарламасы регекстерді қолдамайды! Уайымдамаңыз, біз оны мәжбүрлейміз :)
Жолдарды сәйкестендіру үшін Excel VBA Regex функциясы
Тұрақты өрнектерді пайдалану үшін тақырыптан анық көрініп тұрғандай Excel бағдарламасында сіз өзіңіздің функцияңызды жасауыңыз керек. Бақытымызға орай, Excel VBA жүйесінде төменде көрсетілгендей кодыңызда пайдалануға болатын кірістірілген RegExp нысаны бар:
Қоғамдық функция RegExpMatch(кіріс_ауқымы Ауқым ретінде, үлгі Жол ретінде, қосымша сәйкестік_регистрі логикалық = True ) сияқты Variant Dim arRes() Нәтижелерді сақтауға арналған Variant 'массиві ретінде Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'бастапқы ауқымдағы ағымдағы жолдың индексі, бастапқы ауқымдағы ағымдағы бағанның индексі, жолдар саны, саны бағандар Error On GoTo ErrHandl RegExpMatch = arRes Set regex = CreateObject ( "VBScript.RegExp" ) regex.pattern = үлгі regex.Global = True regex.MultiLine = True Егер True = match_case Содан кейін regex.ignorecase = regex.ignorecase = False Elignore. Соңыөрнектер.Үлгі : \b[\w\.\-]+@[A-Za-z0-9]+[A-Za-z0-9\.\- ]*[A-Za-z0-9]+\.[A-Za-z]{2,24}\b
Мұнда не болып жатқанын жақсырақ түсіну үшін әр бөлікті толығырақ қарастырайық :
- Пайдаланушы аты әріптерді, сандарды, астын сызуды, нүктелерді және сызықшаларды қамтуы мүмкін. \w кез келген әріпке, цифрға немесе астын сызуға сәйкес келетінін есте сақтай отырып, біз келесі регексті аламыз: [\w\.\-]+
- Домен аты бас әріптер мен кіші әріптерді қамтуы мүмкін, сандар, сызықшалар (бірақ бірінші немесе соңғы орында емес) және нүктелер (қосалқы домендер жағдайында). Астыңғы сызықтарға рұқсат етілмегендіктен, \w орнына біз 3 түрлі таңбалар жиынын қолданамыз: [A-Za-z0-9]+[A-Za-z0-9\.\-]*[A-Za-z0-9 ]+
- Жоғарғы деңгейлі домен нүктеден кейін бас және кіші әріптерден тұрады. Ол 2-ден 24-ке дейінгі әріптерді қамтуы мүмкін (қазіргі уақытта бар ең ұзын TLD): \.[A-Za-z]{2,24}
Ескертпе. Үлгі домен атауында 2 немесе одан да көп әріптік-сандық таңбалар бар деп болжайды.
Түпнұсқа мәтін A5 форматында және үлгі A5 форматында болса, формула келесі пішінді алады:
=RegExpMatch(A5, $A$2)
Немесе қарапайым қарапайымды пайдалануға болады. кіші немесе бас әріптермен электрондық поштаны тексеруге арналған өрнек:
Үлгі : \b[\w\.\-]+@[a-z0-9]+[a- z0-9\.\-]*[a-z0-9]+\.[a-z]{2,24}\b
Бірақ формулаңызды регистрді ескермеңіз:
=RegExpMatch(A5, $A$2, FALSE)
Сәйкестік регексі бар Excel IF формуласы
Кірістірілген және реттелетініне байланыстыфункциялар жақсы жүреді, оларды бір формулада бірге пайдалануға ешнәрсе кедергі келтірмейді.
Егер тұрақты өрнек сәйкес келсе, бір нәрсені қайтару немесе есептеу үшін, егер ол сәйкес келмесе, басқа нәрсені қайтару үшін реттелетін RegExpMatch енгізіңіз. IF логикалық мәтініндегі функция:
IF(RegExpMatch(…), [мән_егер_шын], [мән_егер_жалған])Мысалы, A5 жолында жарамды электрондық пошта мекенжайы болса, "Иә" деп қайтаруға болады; әйтпесе "Жоқ".
=IF(RegExpMatch(A5, $A$2,), "Yes", "No")
Егер регекс сәйкес келсе санау
Себебі Excel жергілікті функциялары тұрақты өрнектерді қолдамайды, ол COUNTIS немесе COUNTIFS функциясына регексті тікелей қою мүмкін емес. Бақытымызға орай, сіз бұл функцияны реттелетін функциямыз арқылы эмуляциялай аласыз.
Телефон нөмірлерін сәйкестендіру және нәтижелерді B бағанында шығару үшін regex қолдандыңыз делік. Қанша ұяшықта телефон нөмірлері бар екенін білу үшін сізге жай ғана қажет. B5:B9 ішіндегі TRUE мәндерін санау үшін. Мұны стандартты COUNTIF формуласы арқылы оңай жасауға болады:
=COUNTIF(B5:B9, TRUE)
Жұмыс парағында қосымша бағандар қажет емес пе? Проблема жоқ. Біздің теңшелетін функциямыз бір уақытта бірнеше ұяшықтарды өңдей алатынын және Excel SUM мәні массивтегі мәндерді қоса алатынын есте ұстай отырып, мына әрекетті орындаңыз:
- RegExpMatch үшін ауқым сілтемесін беріңіз, осылайша ол қайтарады ШЫН және ЖАЛҒАН мәндердің жиымы.
- Логикалық мәндерді бір және бір мәндерге мәжбүрлеу үшін қос терістеуді (--) пайдаланыңыз.нөлдер.
- Нәтижедегі массивте 1 және 0-ді қосу үшін SUM функциясын алыңыз.
=SUM(--RegExpMatch(A5:A9, $A$2))
Регекс сәйкестігі Ultimate Suite көмегімен
Біздің Ultimate Suite пайдаланушылары төрт қуатты Regex функциясын жұмыс кітаптарына ешқандай VBA кодын қоспай пайдалана алады, өйткені олар қондырманы орнату кезінде Excel бағдарламасына біркелкі біріктірілген. Біздің теңшелетін функциялар стандартты .NET RegEx механизмімен өңделеді және толық мүмкіндігі бар классикалық қалыпты өрнектерді қолдайды.
Теңшелетін RegexMatch функциясын пайдалану жолы
Сізде Ultimate Suite бағдарламасының соңғы нұсқасы орнатылған деп есептесеңіз ( 2021.4 немесе одан кейінгі нұсқасы), екі қарапайым қадаммен Regex Match формуласын жасауға болады:
- Ablebits Data қойындысындағы Мәтін тобында түймесін басыңыз. Регекс құралдары .
- Таңдаңыз бастапқы жолдар.
- Үлгіңізді енгізіңіз.
- Сәйкестендіру опциясын таңдаңыз.
- Нәтижелерді мәндер емес, формулалар ретінде алу үшін <параметрін таңдаңыз. 8>Формула ретінде кірістіру құсбелгісін қойыңыз.
- Сәйкестендіру түймесін басыңыз.
Біраз уақыттан кейін AblebitsRegexMatch функциясы деректердің оң жағындағы жаңа бағанға кірістіріледі.
Төмендегі скриншотта функция А бағанындағы жолдарда 7 саннан тұратынын тексереді. сандар немесе жоқ.
Кеңестер:
- Функция tion тура ұяшыққа кірістірілуі мүмкінстандартты Функцияны кірістіру тілқатысу терезесі арқылы, мұнда ол AblebitsUDFs астында санатталған.
- Әдепкі бойынша формулаға тұрақты өрнек қосылады, бірақ сіз де сақтай аласыз. ол бөлек ұяшықта. Ол үшін жай ғана 2-аргумент үшін ұяшық сілтемесін пайдаланыңыз.
- Әдепкі бойынша, функция регистрді ескереді . Регистрді ескермейтін сәйкестендіру үшін (?i) үлгісін пайдаланыңыз.
Қосымша ақпарат алу үшін AblebitsRegexMatch функциясын қараңыз.
Міне, Excel бағдарламасында тұрақты өрнек сәйкестігін осылай жасауға болады. Оқығаныңыз үшін алғыс айтамын және сізді келесі аптада біздің блогта күтемін!
Қолжетімді жүктеп алулар
Excel Regex Match мысалдары (.xlsm файлы)
Ultimate Suite 14- күні толық жұмыс істейтін нұсқасы (.exe файлы)
Егер cntInputRows = input_range.Rows.Count cntInputCols = input_range.Columns.Count ReDim arRes(1-cntInputRows, 1-cntInputCols) iInputCurRow үшін = 1 cntInputRows үшін iInputCurCol = 1 үшін cntInputCurCol = 1 үшін cntReg. .Cells(iInputCurRow, iInputCurCol).Value) Келесі Келесі RegExpMatch = arRes Шығу функциясы ErrHandl: RegExpMatch = CVErr(xlErrValue) Аяқтау функциясыКодты VBA өңдегішіне қойыңыз, ал сіздің жаңа RegExp функциясы болады. пайдалануға дайын. VBA-мен тәжірибеңіз болмаса, бұл нұсқаулық пайдалы болуы мүмкін: Excel бағдарламасына VBA кодын енгізу жолы.
Ескертпе. Кодты енгізгеннен кейін файлыңызды макрос қосылған жұмыс кітабы (.xlsm) ретінде сақтауды ұмытпаңыз.
RegExpMatch синтаксисі
RegExpMatch функциясы бастапқы жолдың кез келген бөлігі қалыпты өрнекке сәйкес келетінін тексереді. Нәтиже логикалық мән болып табылады: кем дегенде бір сәйкестік табылса TRUE, әйтпесе ЖАЛҒАН.
Біздің теңшелетін функциямызда 3 аргумент бар - алғашқы екеуі қажет және соңғысы міндетті емес:
RegExpMatch(text , үлгі, [сәйкестік_регистрі])Мұндағы:
- Мәтін (міндетті) - іздеу үшін бір немесе бірнеше жол. Ұяшық немесе ауқым сілтемесі ретінде берілуі мүмкін.
- Үлгі (міндетті) - сәйкес келетін тұрақты өрнек. Тікелей формулаға орналастырылған кезде үлгі қос тырнақшаға алынуы керек.
- Сәйкестік_регі (міндетті емес) - сәйкестікті анықтайдытүрі. ШЫН болса немесе түсірілсе (әдепкі), регистрге сәйкес сәйкестік орындалады; егер FALSE - регистрді ескермейді.
Функция Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 және Excel 2010 нұсқаларының барлық нұсқаларында жұмыс істейді.
3 нәрсе RegExpMatch туралы білуі керек
Тәжірибелік есептеулерге кіріспес бұрын, кейбір техникалық аспектілерді түсіндіретін келесі тармақтарға назар аударыңыз:
- Функция бір ұяшықты<9 өңдей алады> немесе ұяшықтар диапазоны . Соңғы жағдайда нәтижелер көрші ұяшықтарға динамикалық массив немесе төгілу ауқымы түрінде қайтарылады, мысалы, осы мысалда көрсетілгендей.
- Әдепкі бойынша, функция регистрді ескереді . Мәтін регистрін елемеу үшін сәйкестік_жағдай аргументін ЖАЛҒАН етіп орнатыңыз. VBA Regexp шектеулеріне байланысты регистрді ескермейтін үлгіге (?i) қолдау көрсетілмейді.
- Егер жарамды үлгі табылмаса, функция FALSE мәнін қайтарады; үлгі жарамсыз болса, #VALUE! қате орын алады.
Төменде демонстрация мақсатында жасалған бірнеше regex сәйкестік мысалдарын табасыз. Біз үлгілеріміздің нақты жұмыс парақтарындағы енгізу деректерінің кең ауқымымен қатесіз жұмыс істейтініне кепілдік бере алмаймыз. Өндіріске қоспас бұрын, үлгі үлгілерімізді қажеттіліктеріңізге сәйкес тексеріп, реттеңіз.
Excel бағдарламасындағы жолдарды сәйкестендіру үшін regex әдісін пайдалану
Сәйкестендіру қажет барлық жолдарда бірдей үлгі,тұрақты өрнектер тамаша шешім болып табылады.
Егер сізде кейбір элементтер туралы әртүрлі мәліметтерді қамтитын ұяшықтар ауқымы (A5:A9) бар делік. Қандай ұяшықтарда SKU бар екенін білгіңіз келеді. Әрбір SKU 2 бас әріптен, сызықшадан және 3 цифрдан тұрады деп есептесек, оларды келесі өрнекті пайдаланып сәйкестендіруге болады.
Үлгі : \b[A-Z]{2}-\ d{3}\b
Мұндағы [A-Z]{2} А-дан Я-ға дейінгі кез келген 2 бас әріпті және \d{3} 0-ден 9-ға дейінгі кез келген 3 санды білдіреді. \b таңбасы сөзді білдіреді шекара, яғни SKU жеке сөз болып табылады және үлкен жолдың бөлігі емес, мысалы, 23-MAR-2022.
Орнатылған үлгімен формула жазуға көшуге болады. Негізінде, теңшелетін функцияны пайдалану жергілікті функциядан еш айырмашылығы жоқ. Формула теруді бастаған бойда функцияның аты Excel бағдарламасының Автотолтыру ұсынған тізімде пайда болады. Дегенмен, динамикалық массив Excel (Microsoft 365 және Excel 2021) және дәстүрлі Excel (2019 және одан бұрынғы нұсқалары) бірнеше нюанстар бар.
Бір ұяшықтағы жолды сәйкестендіру
Жолды сәйкестендіру үшін бір ұяшықта бірінші аргументтегі ұяшыққа сілтеме жасаңыз. Екінші аргумент тұрақты өрнекті қамтуы керек.
=RegExpMatch(A5, "\b[A-Z]{2}-\d{3}\b")
Үлгі абсолютті сілтемемен ($A$2) құлыпталған алдын ала анықталған ұяшықта да сақталуы мүмкін:
=RegExpMatch(A5, $A$2)
Бірінші ұяшыққа формуланы енгізгеннен кейін оны барлық басқа жолдарға сүйреп апаруға болады.
Бұл әдіс барлық Excel нұсқаларында тамаша жұмыс істейді.
Бірден бірнеше ұяшықтардағы жолдарды сәйкестендіру
Бір формуламен бірнеше жолды сәйкестендіру үшін, бірінші аргументте ауқым сілтемесін қосыңыз:
=RegExpMatch(A5:A9, "\b[A-Z]{2}-\d{3}\b")
Динамикалық массивтерді қолдайтын Excel 365 және Excel 2021 нұсқаларында ол осылай жұмыс істейді - формуланы бірінші ұяшыққа тересіз, Enter пернесін басыңыз және формула төмендегі ұяшықтарға автоматты түрде түседі.
Excel 2019 және одан бұрынғы нұсқаларында ол тек ұяшықтар ауқымына енгізілетін және Ctrl + Shift + Enter пернелерін бірге басу арқылы аяқталатын дәстүрлі CSE массивінің формуласы ретінде жұмыс істейді.
Сандарды сәйкестендіру үшін регекс
0-ден 9-ға дейінгі кез келген жалғыз санды сәйкестендіру үшін регекстегі \d таңбасын пайдаланыңыз. Белгілі бір тапсырмаға байланысты сәйкес кванторды қосыңыз немесе күрделірек үлгіні жасаңыз.
Кез келген санға сәйкес келетін регекс
Кез келген ұзындықтағы кез келген санды сәйкестендіру үшін + кванфикаторын / белгісінен кейін қойыңыз. d таңбасы, ол 1 немесе одан да көп цифрдан тұратын сандарды іздеуді білдіреді.
Үлгі : \d+
=RegExpMatch(A5:A9, "\d+")
Нақты ұзындық санын сәйкестендіру үшін регекс
Егер мақсатыңыз белгілі бір сандар санын қамтитын сандық мәндерді сәйкестендіру болса, онда \d сәйкес квантормен бірге пайдаланыңыз.
Мысалы, дәл 7 саннан тұратын шот-фактура нөмірлерін сәйкестендіру үшін \d{7} пайдаланасыз. Дегенмен, оның 7-ге сәйкес келетінін есте сақтаңызкүткендей:
Ескертулер:
- Халықаралық кодтар тексерілмеген, сондықтан олар болуы немесе болмауы мүмкін.
- Тұрақты өрнектерде \s бос орын, қойынды, каретканы қайтару немесе жаңа жол сияқты кез келген бос орын таңбасын білдіреді. Тек бос орындарға рұқсат беру үшін [-\ пайдаланыңыз. ] орнына [-\.\s].
- [^13] 1 немесе 3 емес кез келген жалғыз таңбаға сәйкес келеді.
- [^1-3] 1 емес кез келген жалғыз таңбаға сәйкес келеді, 2 немесе 3 (яғни, 1-ден 3-ке дейінгі кез келген сан).
- Жоғарыдағы регекс тек бір жолды жолдар үшін жұмыс істейді. Милти-жолды жолдарда ^ және $ таңбалары кіріс жолының басы мен соңының орнына әр жолдың басы мен соңына сәйкес келеді, сондықтан регекс тек бірінші жолда іздейді.
- басталмайтын белгілі бір мәтінмен сәйкестендіру үшін ^(?!лимондар).*$
- сияқты тұрақты өрнекті пайдаланыңыз. аяқталмайтын белгілі бір мәтінмен сәйкестендіру үшін қосыңызсоңғы жолды іздеу үлгісіне бекітеді: ^((?!lemons$).)*$
Таңбаға СӘЙКЕС ЕМЕС регекс
Белгілі бір таңбаны қамтымайтын жолдарды табу үшін сәйкес келетін жоққа шығарылған таңбалар кластарын [^ ] пайдалануға болады жақшада ЕМЕС ештеңе. Мысалы:
Телефон нөмірлерінің тізімінде ел коды жоқ нөмірлерді тапқыңыз келеді делік. Кез келген халықаралық кодта + белгісі бар екенін есте ұстай отырып, қосу белгісі жоқ жолдарды табу үшін [^\+] таңба сыныбын пайдалануға болады. Жоғарыдағы өрнек + емес кез келген жалғыз таңбаға сәйкес келетінін түсіну маңызды. Телефон нөмірі ең басында міндетті емес, жолдың кез келген жерінде болуы мүмкін болғандықтан, әрбір келесі таңбаны тексеру үшін * кванторы қосылады. Бастау ^ және аяқталу $ анкерлері бүкіл жолдың өңделуін қамтамасыз етеді. Нәтижесінде біз төмендегі тұрақты өрнекті аламыз, ол «жолдағы ешбір орындағы + таңбасына сәйкес келмейді».
Үлгі :^[^\+]*$
=RegExpMatch(A5, "^[^\+]*$")
ЖОЛҒА СӘЙКЕСТІК ЕМЕС регекс
Бірақ үшін арнайы тұрақты өрнек синтаксисі жоқ Белгілі бір жолға сәйкес келмесе, бұл әрекетті теріс қарап шығу арқылы эмуляциялауға болады.
Егер сіз құрамында «лимон» сөзі жоқ жолдарды тапқыңыз келсе. Бұл тұрақты өрнек жұмыс істейді:
Үлгі : ^((?!лимондар).)*$
Әрине, мұнда біраз түсініктеме қажет. Теріс көзқарас (?!лимондар) алда «лимондар» сөзі жоқ па, жоқ па деп оңға қарайды. Егер «лимондар» болмаса, онда нүкте жол үзілімінен басқа кез келген таңбаға сәйкес келеді. Жоғарыдағы өрнек бір ғана тексеруді орындайды, ал * кванторы оны ^ арқылы бекітілген жолдың басынан $ арқылы бекітілген жолдың соңына дейін нөл немесе одан көп рет қайталайды.
Мәтін регистрін елемеу үшін, функциямызды регистрді ескермейтін ету үшін 3-ші аргументті ЖАЛҒАН деп орнаттық:
=RegExpMatch(A5, $A$2, FALSE)
Кеңестер мен ескертпелер:
Үлгілерді ескермейтін сәйкестік
Классикалық тұрақты өрнектерде арнайы үлгі бар. регистрді ескермейтін сәйкестік (?i), оған VBA RegExp ішінде қолдау көрсетілмейді. Бұл шектеуді еңсеру үшін біздің теңшелетін функция сәйкестік_жағдай деп аталатын 3-қосымша аргументті қабылдайды. Регистрді ескермейтін сәйкестендіруді орындау үшін оны ЖАЛҒАН етіп орнатыңыз.
1-наурыз-22 немесе 2022-01-наурыз сияқты күндерді анықтағыңыз келеді делік. dd-mmm-yyyy және d-mmm-yy пішімдерін сәйкестендіру үшін біз келесі тұрақты өрнекті пайдаланамыз.
Үлгі : \b\d{1,2}-(қаң10 немесе 100 санды қоса алғанда, жолдың кез келген жеріндегі сандар. Егер бұл сіз іздеген нәрсе болмаса, екі жағына \b сөзінің шекарасын қойыңыз.
Үлгі : \b\d{7}\b
=RegExpMatch(A5:A9, "\b\d{7}\b")
Телефон нөмірлерін сәйкестендіру үшін регекс
Телефон нөмірлері әртүрлі пішімдерде жазылуы мүмкін болғандықтан, оларды сәйкестендіру күрделірек тұрақты өрнекті қажет етеді.
Төмендегі деректер жинағында біз алғашқы 2 топта 3 цифры және соңғы топтағы 4 цифры бар 10 таңбалы сандарды іздейміз. Топтарды нүкте, сызықша немесе бос орын арқылы бөлуге болады. Бірінші топ жақшаға алынуы немесе алынбауы мүмкін.
Үлгі: (\(\d{3}\)