Excel Regex: dopasowywanie ciągów za pomocą wyrażeń regularnych

  • Udostępnij To
Michael Brown

W tym tutorialu przyjrzymy się dogłębnie, jak używać regex do dopasowywania ciągów w Excelu.

Gdy potrzebujesz znaleźć określoną wartość w zakresie komórek, użyłbyś funkcji MATCH lub XMATCH. Gdy szukasz określonego ciągu znaków w komórce, z pomocą przychodzą funkcje FIND i SEARCH. A jak sprawdzić, czy komórka zawiera informacje pasujące do danego wzorca? Oczywiście za pomocą wyrażeń regularnych. Ale po wyjęciu z pudełka Excel nie obsługuje regexów! Bez obaw, zmusimy go do tego :)

    Excel VBA Funkcja Regex do dopasowywania ciągów znaków

    Jak wynika z nagłówka, aby używać wyrażeń regularnych w Excelu, trzeba stworzyć własną funkcję. Na szczęście VBA w Excelu ma wbudowany RegExp obiekt, który możesz wykorzystać w swoim kodzie jak pokazano poniżej:

    Public Function RegExpMatch(input_range As Range, pattern As String , Optional match_case As Boolean = True ) As Variant Dim arRes() As Variant 'tablica do przechowywania wyników Dim iInputCurRow, iInputCurCol, cntInputRows, cntInputCols As Long 'indeks bieżącego wiersza w zakresie źródłowym, indeks bieżącej kolumny w zakresie źródłowym, count of rows, count of columns 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 To cntInputRows, 1 To cntInputCols) For iInputCurRow = 1 To cntInputRows ForiInputCurCol = 1 To cntInputCols arRes(iInputCurRow, iInputCurCol) = regex.Test(input_range.Cells(iInputCurRow, iInputCurCol).Value) Next Next RegExpMatch = arRes Exit Function ErrHandl: RegExpMatch = CVErr(xlErrValue) End Function

    Wklej kod w edytorze VBA, a twój nowy RegExpMatch funkcja jest gotowa do użycia. Jeśli nie masz dużego doświadczenia z VBA, pomocny może być ten poradnik: Jak wstawić kod VBA w Excelu.

    Uwaga. Po wstawieniu kodu pamiętaj, aby zapisać plik jako. skoroszyt z obsługą makr (.xlsm).

    Składnia RegExpMatch

    Na stronie RegExpMatch Funkcja sprawdza czy jakakolwiek część łańcucha źródłowego pasuje do wyrażenia regularnego. Wynikiem jest wartość logiczna: TRUE jeśli znaleziono przynajmniej jedno dopasowanie, FALSE w przeciwnym wypadku.

    Nasza niestandardowa funkcja ma 3 argumenty - pierwsze dwa są wymagane, a ostatni jest opcjonalny:

    RegExpMatch(text, pattern, [match_case])

    Gdzie:

    • Tekst (wymagane) - jeden lub więcej ciągów znaków do przeszukiwania. Może być podany jako odwołanie do komórki lub zakresu.
    • Wzór (wymagane) - wyrażenie regularne do dopasowania. W przypadku umieszczenia bezpośrednio w formule, wzorzec musi być ujęty w podwójne cudzysłowy.
    • Dopasowanie (opcjonalne) - określa typ dopasowania. Jeżeli TRUE lub pominięte (domyślnie), to zostanie wykonane dopasowanie z uwzględnieniem wielkości liter; jeżeli FALSE - bez uwzględnienia wielkości liter.

    Funkcja działa we wszystkich wersjach programów Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 i Excel 2010.

    3 rzeczy, które powinieneś wiedzieć o RegExpMatch

    Zanim przejdziemy do praktycznych obliczeń, proszę zwrócić uwagę na poniższe punkty, które wyjaśniają pewne kwestie techniczne:

    1. Funkcja może przetwarzać pojedyncza komórka lub zakres komórek W tym drugim przypadku wyniki są zwracane w sąsiednich komórkach w postaci tablicy dynamicznej lub zakresu rozlanego, jak pokazano w tym przykładzie.
    2. Domyślnie funkcja ta to. rozróżnianie wielkości liter Aby zignorować wielkość liter w tekście, ustaw dopasowanie_przypadku Z powodu ograniczeń VBA Regexp nie jest obsługiwany wzorzec niewrażliwy na wielkość liter (?i).
    3. Jeśli nie zostanie znaleziony prawidłowy wzorzec, funkcja zwraca FALSE; jeśli wzór jest nieprawidłowy , pojawia się błąd #VALUE!

    Poniżej znajdziesz kilka przykładów dopasowania regex, które zostały stworzone w celach demonstracyjnych. Nie możemy zagwarantować, że nasze wzory będą działać bezbłędnie z szerszym zakresem danych wejściowych w twoich rzeczywistych arkuszach. Przed wprowadzeniem do produkcji, upewnij się, że przetestujesz i dostosujesz nasze wzory do swoich potrzeb.

    Jak używać regex do dopasowywania ciągów w Excelu

    Kiedy wszystkie ciągi, które chcesz dopasować, mają ten sam wzór, wyrażenia regularne są idealnym rozwiązaniem.

    Przypuśćmy, że mamy zakres komórek (A5:A9) zawierających różne szczegóły dotyczące pewnych przedmiotów. Chcemy wiedzieć, które komórki mają numery SKU. Zakładając, że każdy SKU składa się z 2 dużych liter, myślnika i 3 cyfr, możemy je dopasować za pomocą następującego wyrażenia.

    Wzór : B[A-Z]{2} - B[a]

    Gdzie [A-Z]{2} oznacza 2 dowolne wielkie litery od A do Z, a Ąd{3} oznacza 3 dowolne cyfry od 0 do 9. Znak Ąd oznacza granicę słowa, czyli SKU jest osobnym słowem, a nie częścią większego ciągu, np. 23-MAR-2022.

    Mając ustalony wzór, możemy przejść do pisania formuły. Zasadniczo korzystanie z funkcji niestandardowej nie różni się od funkcji natywnej. Gdy tylko zaczniesz wpisywać formułę, nazwa funkcji pojawi się na liście sugerowanej przez AutoComplete Excela. Istnieje jednak kilka niuansów w Dynamic Array Excel (Microsoft 365 i Excel 2021) i tradycyjnym Excelu (2019 i starsze wersje).

    Dopasuj ciąg w jednej komórce

    Aby dopasować ciąg w pojedynczej komórce, odwołaj się do tej komórki w pierwszym argumencie. Drugi argument ma zawierać wyrażenie regularne.

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

    Wzorzec może być również przechowywany w predefiniowanej komórce, która jest zablokowana odwołaniem bezwzględnym ($A$2):

    =RegExpMatch(A5, $A$2)

    Po wprowadzeniu formuły w pierwszej komórce możesz ją przeciągnąć w dół do wszystkich pozostałych wierszy.

    Ta metoda działa pięknie w wszystkie wersje programu Excel .

    Dopasowywanie ciągów znaków w wielu komórkach jednocześnie

    Aby dopasować wiele łańcuchów za pomocą pojedynczej formuły, dołącz referencję zakresu w pierwszym argumencie:

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

    W Excel 365 oraz Excel 2021 które obsługują dynamiczne tablice, działa to w ten sposób - wpisujesz formułę w pierwszej komórce, naciskasz Enter , a formuła automatycznie rozlewa się do poniższych komórek.

    W Excel 2019 r. i wcześniejszych, działa tylko jako tradycyjna formuła tablicowa CSE, którą wprowadza się do zakresu komórek i uzupełnia przez łączne naciśnięcie klawiszy Ctrl + Shift + Enter.

    Regex do dopasowania numeru

    Aby dopasować dowolną pojedynczą cyfrę od 0 do 9, należy użyć \d W zależności od zadania, dodaj odpowiedni kwantyfikator lub stwórz bardziej złożony wzorzec.

    Regex do dopasowania dowolnej liczby

    Aby dopasować dowolną liczbę o dowolnej długości, umieść kwantyfikator + zaraz po znaku /d, który mówi, aby szukać liczb zawierających 1 lub więcej cyfr.

    Wzór : \d+

    =RegExpMatch(A5:A9, "\")

    Regex do dopasowania liczby o określonej długości

    Jeśli Twoim celem jest dopasowanie wartości numerycznych zawierających określoną liczbę cyfr, to użyj \u200 wraz z odpowiednim kwantyfikatorem.

    Na przykład, aby dopasować numery faktur składające się z dokładnie 7 cyfr, użyłbyś \d{7}. Należy jednak pamiętać, że dopasuje on 7 cyfr w dowolnym miejscu ciągu, w tym 10- lub 100-cyfrowego numeru. Jeśli nie jest to to, czego szukasz, umieść słowo graniczne \b po obu stronach.

    Wzór : \u200 \u200 \u200 \u200 \u200 \u200 \u200 \u200

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

    Regex do dopasowania numerów telefonów

    Ponieważ numery telefonów mogą być zapisane w różnych formatach, dopasowanie ich wymaga bardziej wyrafinowanego wyrażenia regularnego.

    W poniższym zbiorze danych będziemy szukać 10-cyfrowych liczb, które mają 3 cyfry w pierwszych dwóch grupach i 4 cyfry w ostatniej grupie. Grupy mogą być oddzielone kropką, myślnikiem lub spacją. Pierwsza grupa może, ale nie musi być ujęta w nawiasy.

    Wzór: (ą)

    Rozbijając to wyrażenie regularne, oto co otrzymujemy:

    • Pierwsza część (ą)
    • Część [-?] oznacza 0 lub 1 wystąpienie dowolnego znaku w nawiasach kwadratowych: myślnika, kropki lub białej spacji.
    • Następnie jest jeszcze jedna grupa 3 cyfr d{3}, po której następuje dowolny myślnik, kropka lub biała spacja [ą]? występująca 0 lub 1 raz.

    Mając oryginalny ciąg w A5 i wyrażenie regularne w A2, formuła przyjmuje taką postać:

    =RegExpMatch(A5, $A$2)

    ...i działa dokładnie tak, jak się spodziewałem:

    Uwagi:

    • Kody międzynarodowe nie są sprawdzane, więc mogą być obecne lub nie.
    • W wyrażeniach regularnych \ oznacza dowolny biały znak, taki jak spacja, tabulator, powrót karetki lub nowy wiersz. Aby zezwolić tylko na spacje, użyj [-. ] zamiast [-.]
    • Regex, aby NIE dopasować znaku

      Aby znaleźć ciągi, które NIE zawierają określonego znaku, możesz użyć zanegowanych klas znaków [^ ], które pasują do wszystkiego, co NIE jest w nawiasach.Na przykład:

      • [^13] dopasuje każdy pojedynczy znak, który nie jest 1 lub 3.
      • [^1-3] dopasuje każdy pojedynczy znak, który nie jest 1, 2 lub 3 (tj. każdą cyfrę od 1 do 3).

      Przypuśćmy, że na liście numerów telefonów chcemy znaleźć te, które nie mają numeru kierunkowego kraju. Pamiętając, że każdy międzynarodowy kod zawiera znak +, możemy użyć klasy znaków [^\+], aby znaleźć ciągi, które nie zawierają znaku plus. Ważne jest, aby zdać sobie sprawę, że powyższe wyrażenie pasuje do każdego pojedynczego znaku, który nie jest +. Ponieważ numer telefonu może być w dowolnym miejscu łańcucha, niekoniecznie na samym początku, kwantyfikator * jest dodawany w celu sprawdzenia każdego kolejnego znaku. Kotwice startowa ^ i końcowa $ zapewniają, że cały ciąg jest przetwarzany. W efekcie otrzymujemy poniższe wyrażenie regularne, które mówi "nie dopasowuj znaku + w żadnej pozycji w ciągu".

      Wzór : ^[^\+]*$

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

      Regex, aby NIE dopasować łańcucha

      Chociaż nie ma specjalnej składni wyrażenia regularnego dla niedopasowania określonego łańcucha, możesz emulować to zachowanie poprzez użycie ujemnego lookahead.

      Załóżmy, że chcesz znaleźć ciągi, które nie zawierają To wyrażenie regularne zadziała jak należy:

      Wzór : ^((?!cytryny).)*$

      Oczywiście, potrzebne jest tu pewne wyjaśnienie. Negatywny lookahead (?!lemons) patrzy w prawo, aby sprawdzić, czy przed nim nie ma słowa "lemons". Jeśli nie ma tam "lemons", to kropka pasuje do dowolnego znaku oprócz przerwy w linii. Powyższe wyrażenie wykonuje tylko jedno sprawdzenie, a kwantyfikator * powtarza je zero lub więcej razy, od początku łańcucha zakotwiczonego przez ^ do końca łańcucha zakotwiczonego przez$.

      Aby zignorować przypadek tekstu, ustawiamy 3. argument na FALSE, aby nasza funkcja nie uwzględniała wielkości liter:

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

      Wskazówki i uwagi:

      • Powyższy regex działa tylko dla jednolinijkowy W przypadku łańcuchów milti-liniowych, znaki ^ i $ dopasowują początek i koniec każdej linii zamiast początku i końca łańcucha wejściowego, dlatego regex szuka tylko w pierwszej linii.
      • Aby dopasować ciągi znaków, które nie ruszać z pewnym tekstem , użyj wyrażenia regularnego, takiego jak ^(?!cytryny).*$.
      • Aby dopasować ciągi znaków, które nie kończyć z pewnym tekstem , włączamy do wzorca wyszukiwania kotwicę ciągu końcowego: ^((?!lemons$).)*$.

      Dopasowanie bez uwzględniania wielkości liter

      W klasycznych wyrażeniach regularnych istnieje specjalny wzorzec dla rozróżniania wielkości liter (?i), który nie jest obsługiwany w VBA RegExp. Aby pokonać to ograniczenie, nasza funkcja przyjmuje trzeci opcjonalny argument o nazwie dopasowanie_przypadku Aby rozróżnić wielkość liter, wystarczy ustawić ją na FALSE.

      Załóżmy, że chcesz określić daty takie jak 1-Mar-22 lub 01-MAR-2022. Aby dopasować dd-mmm-rrrr oraz d-mmm-yy formatów, używamy następującego wyrażenia regularnego.

      Wzór : \u200 \u200 \u200 \u200 \u200 \u200 \u200 \u200

      Nasze wyrażenie wyszukuje grupę 1 lub 2 cyfr, po których następuje myślnik, a następnie dowolny skrót miesiąca oddzielony znakiem

      Dlaczego nie użyć prostszego wzoru, takiego jak \u200}-[A-Za-z]{3}-\u200}? Aby zapobiec fałszywym pozytywnym dopasowaniom, takim jak 01-ABC-2020.

      Wpisz wzór w A2, a otrzymasz następujący wzór:

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

      Regex do dopasowania ważnych adresów e-mail

      Jak powszechnie wiadomo, adres e-mail składa się z 4 części: nazwy użytkownika, symbolu @, nazwy domeny (serwera pocztowego) oraz domeny najwyższego poziomu (takiej jak .com, .edu, .org, itp.). Aby sprawdzić ważność adresu e-mail, będziemy musieli powielić powyższą strukturę za pomocą wyrażeń regularnych.

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

      Aby lepiej zrozumieć, co się tu dzieje, przyjrzyjmy się bliżej każdej części:

      • Nazwa użytkownika może zawierać litery, cyfry, podkreślenia, kropki i myślniki. Pamiętając, że "w" pasuje do każdej litery, cyfry lub podkreślenia, otrzymujemy następujący regex: [\u200 \u200 \u200 \u200
      • Nazwa domeny może zawierać duże i małe litery, cyfry, myślniki (ale nie na pierwszej i ostatniej pozycji) oraz kropki (w przypadku subdomen). Ponieważ podkreślniki nie są dozwolone, zamiast Ąw używamy 3 różnych zestawów znaków: [A-Za-z0-9]+[A-Za-z0-9]*[A-Za-z0-9]+.
      • Domena najwyższego poziomu składa się z kropki, po której następują duże i małe litery. Może zawierać od 2 do 24 liter (najdłuższa obecnie istniejąca TLD):[A-Za-z]{2,24}

      Uwaga. Wzorzec zakłada, że nazwa domeny zawiera 2 lub więcej znaków alfanumerycznych.

      Przy oryginalnym tekście w A5 i wzorze w A5, wzór przyjmuje taki kształt:

      =RegExpMatch(A5, $A$2)

      Lub możesz użyć prostszego wyrażenia regularnego do sprawdzania poprawności wiadomości e-mail z zestawem małych lub dużych liter:

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

      Ale spraw, aby twoja formuła nie uwzględniała wielkości liter:

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

      Formuła Excel IF z dopasowaniem regex

      Ze względu na fakt, że funkcje wbudowane i niestandardowe ładnie się dogadują, nic nie stoi na przeszkodzie, aby używać ich razem w jednej formule.

      Aby zwrócić lub obliczyć coś, jeśli wyrażenie regularne jest dopasowane i coś innego, jeśli nie jest dopasowane, osadzić niestandardową funkcję RegExpMatch w tekście logicznym IF:

      IF(RegExpMatch(...), [wartość_if_true], [wartość_if_false])

      Na przykład, jeśli ciąg w A5 zawiera prawidłowy adres e-mail, możesz zwrócić "Tak"; w przeciwnym razie "Nie".

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

      Policz, czy regex został dopasowany

      Ponieważ natywne funkcje Excela nie obsługują wyrażeń regularnych, nie jest możliwe umieszczenie regex bezpośrednio w funkcji COUNTIS lub COUNTIFS. Na szczęście możesz emulować tę funkcjonalność za pomocą naszej niestandardowej funkcji.

      Załóżmy, że użyłeś regexa do dopasowania numerów telefonów i umieściłeś wyniki w kolumnie B. Aby dowiedzieć się, ile komórek zawiera numery telefonów, wystarczy policzyć wartości TRUE w B5:B9. Można to łatwo zrobić za pomocą standardowej formuły COUNTIF:

      =COUNTIF(B5:B9, TRUE)

      Nie chcesz mieć dodatkowych kolumn w swoim arkuszu? Żaden problem. Pamiętając o tym, że nasza funkcja niestandardowa może przetwarzać wiele komórek jednocześnie, a SUM w Excelu może sumować wartości w tablicy, oto co robisz:

      • Podaj RegExpMatch referencję do zakresu, aby zwrócił tablicę wartości TRUE i FALSE.
      • Użyj podwójnej negacji (--), aby wymusić wartości logiczne na jedynki i zera.
      • Pobierz funkcję SUM, aby zsumować 1's i 0's w wynikowej tablicy.

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

      Dopasowywanie Regex przy użyciu Ultimate Suite

      Użytkownicy naszego pakietu Ultimate Suite mogą wykorzystać cztery potężne funkcje Regex bez dodawania jakiegokolwiek kodu VBA do swoich skoroszytów, ponieważ są one płynnie zintegrowane z programem Excel podczas instalacji dodatku. Nasze niestandardowe funkcje są przetwarzane przez standardowy silnik .NET RegEx i obsługują w pełni funkcjonalne klasyczne wyrażenia regularne.

      Jak używać niestandardowej funkcji RegexMatch

      Zakładając, że masz zainstalowaną najnowszą wersję Ultimate Suite (2021.4 lub nowszą), możesz stworzyć formułę Regex Match w dwóch prostych krokach:

      1. Na Dane Ablebits zakładka, w Tekst grupa, kliknij Narzędzia Regex .

    • Na Narzędzia Regex wykonaj następujące czynności:
      • Wybierz ciągi źródłowe.
      • Wprowadź swój wzór.
      • Wybierz Mecz opcja.
      • Aby wyniki były formułami, a nie wartościami, wybierz opcję Wstaw jako wzór pole wyboru.
      • Kliknij przycisk Mecz przycisk.

      Chwilę później AblebitsRegexMatch funkcja jest wstawiana do nowej kolumny po prawej stronie twoich danych.

      Na poniższym zrzucie ekranu funkcja sprawdza, czy ciągi w kolumnie A zawierają liczby 7-cyfrowe, czy nie.

      Wskazówki:

      • Funkcją może być wstawiony bezpośrednio w komórce poprzez standard Funkcja wstawiania okna dialogowego, gdzie jest on skategoryzowany pod AblebitsUDFs .
      • Domyślnie wyrażenie regularne jest dodawane do formuły, ale możesz również zachować je w osobnej komórce. W tym celu wystarczy użyć odwołania do komórki dla 2. argumentu.
      • Domyślnie funkcja ta to. rozróżnianie wielkości liter Dla dopasowania bez rozróżniania wielkości liter należy użyć wzorca (?i).

      Aby uzyskać więcej informacji, zapoznaj się z funkcją AblebitsRegexMatch.

      Oto jak zrobić dopasowanie wyrażeń regularnych w Excelu. Dziękuję za przeczytanie i czekam na Ciebie na naszym blogu za tydzień!

      Dostępne pliki do pobrania

      Przykłady dopasowania Regex w Excelu (plik .xlsm)

      Ultimate Suite 14-dniowa w pełni funkcjonalna wersja (plik .exe)

    Michael Brown jest oddanym entuzjastą technologii z pasją do upraszczania złożonych procesów za pomocą narzędzi programowych. Dzięki ponad dziesięcioletniemu doświadczeniu w branży technologicznej doskonalił swoje umiejętności w programach Microsoft Excel i Outlook, a także w Arkuszach i Dokumentach Google. Blog Michaela jest poświęcony dzieleniu się swoją wiedzą i doświadczeniem z innymi, dostarczając łatwych do zastosowania wskazówek i samouczków w celu poprawy produktywności i wydajności. Niezależnie od tego, czy jesteś doświadczonym profesjonalistą, czy początkującym, blog Michaela oferuje cenne spostrzeżenia i praktyczne porady dotyczące maksymalnego wykorzystania tych niezbędnych narzędzi programowych.