Spis treści
Czy myślałeś kiedyś, jak potężny byłby Excel, gdyby ktoś wzbogacił jego zestaw narzędzi o wyrażenia regularne? My nie tylko myśleliśmy, ale i pracowaliśmy nad tym :) A teraz możesz dodać tę wspaniałą funkcję RegEx do swoich własnych skoroszytów i błyskawicznie wymazać podciągi pasujące do wzorca!
W zeszłym tygodniu przyjrzeliśmy się temu, jak używać wyrażeń regularnych do zastępowania ciągów w Excelu. W tym celu stworzyliśmy niestandardową funkcję Regex Replace. Jak się okazało, funkcja wykracza poza swoje podstawowe zastosowanie i może nie tylko zastępować ciągi, ale również je usuwać. Jak to możliwe? W ujęciu Excela usunięcie wartości to nic innego jak zastąpienie jej pustym ciągiem, czyli coś, co nasza funkcja Regexbardzo dobrze!
Funkcja VBA RegExp do usuwania podciągów w Excelu
Jak wiadomo, wyrażenia regularne nie są domyślnie obsługiwane w Excelu. Aby je włączyć, trzeba stworzyć własną funkcję definiowaną przez użytkownika. Dobra wiadomość jest taka, że taka funkcja jest już napisana, przetestowana i gotowa do użycia. Wystarczy skopiować ten kod, wkleić go do edytora VBA, a następnie zapisać plik jako skoroszyt z obsługą makr (.xlsm).
Funkcja ma następującą składnię:
RegExpReplace(text, pattern, replacement, [instance_num], [match_case])Pierwsze trzy argumenty są wymagane, ostatnie dwa są opcjonalne.
Gdzie:
- Tekst - łańcuch tekstowy do wyszukania.
- Wzór - wyrażenie regularne do wyszukiwania.
- Wymiana - tekst, który ma zostać zastąpiony. do usuwać podciągi pasujące do wzorca, użyj pusty ciąg ("") w celu wymiany.
- Liczba instancji (opcjonalne) - instancja do zastąpienia. Jeżeli pominięte, to wszystkie znalezione dopasowania są zastępowane (domyślnie).
- Dopasowanie (opcjonalne) - wartość logiczna określająca czy dopasowywać czy ignorować wielkość liter w tekście. Dla dopasowania z uwzględnieniem wielkości liter należy użyć TRUE (domyślnie); dla niewrażliwości na wielkość liter - FALSE.
Więcej informacji na ten temat można znaleźć w funkcji RegExpReplace.
Wskazówka W prostych przypadkach możesz usunąć określone znaki lub słowa z komórek za pomocą formuł Excela. Ale wyrażenia regularne zapewniają znacznie więcej opcji w tym zakresie.
Jak usuwać ciągi znaków za pomocą wyrażeń regularnych - przykłady
Jak wspomniano powyżej, aby usunąć części tekstu pasujące do wzorca, masz zastąpić je pustym ciągiem. Zatem formuła generyczna przyjmuje taki kształt:
RegExpReplace(text, pattern, "", [instance_num], [match_case])Poniższe przykłady pokazują różne implementacje tej podstawowej koncepcji.
Usuń wszystkie dopasowania lub konkretne dopasowanie
Funkcja RegExpReplace ma za zadanie znaleźć wszystkie podłańcuchy pasujące do podanego regexa. To, które wystąpienia mają zostać usunięte, kontrolowane jest przez czwarty opcjonalny argument o nazwie instancja_numer .
Domyślnie jest to "wszystkie mecze" - gdy instancja_numer Aby usunąć konkretne dopasowanie, należy określić numer instancji.
W poniższych ciągach załóżmy, że chcesz usunąć pierwszy numer porządkowy. Wszystkie takie numery zaczynają się od znaku haszującego (#) i zawierają dokładnie 5 cyfr. Możemy więc zidentyfikować je za pomocą tego regexu:
Wzór
Granica słów określa, że pasujący podłańcuch nie może być częścią większego ciągu, takiego jak #10000001.
Aby usunąć wszystkie dopasowania, należy instancja_numer argument nie jest zdefiniowany:
=RegExpReplace(A5, "#d{5}}", "")
Aby wyeliminować tylko pierwsze wystąpienie, ustawiamy instancja_numer argument do 1:
=RegExpReplace(A5, "#d{5}}", "", 1)
Regex do usuwania określonych znaków
Aby usunąć określone znaki z ciągu, wystarczy wypisać wszystkie niechciane znaki i oddzielić je pionowym paskiem
Na przykład, aby ujednolicić numery telefonów zapisane w różnych formatach, najpierw pozbywamy się specyficznych znaków, takich jak nawiasy, myślniki, kropki i białe spacje.
Wzór : \(
=RegExpReplace(A5, "\
Wynikiem tej operacji jest 10-cyfrowa liczba, taka jak "1234567890".
Dla wygody możesz wpisać regex w osobnej komórce i odwołać się do niej używając odwołania bezwzględnego, np. $A$2:
=RegExpReplace(A5, $A$2, "")
A potem możesz ujednolicić formatowanie tak, jak chcesz, używając operatora konkatenacji (&) i funkcji Text, takich jak RIGHT, MID i LEFT.
Na przykład, aby zapisać wszystkie numery telefonów w formacie (123) 456-7890, wzór to:
="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)
Gdzie B5 jest wyjściem funkcji RegExpReplace.
Usuń znaki specjalne używając regex
W jednym z naszych tutoriali przyjrzeliśmy się, jak usunąć niechciane znaki w Excelu za pomocą funkcji wbudowanych i niestandardowych. Wyrażenia regularne znacznie ułatwiają sprawę! Zamiast wymieniać wszystkie znaki do usunięcia, wystarczy określić te, które chcesz zachować :)
Wzór oparty jest na. klasy znaków zanegowanych - w klasie znaków [^ ] umieszczany jest caret, by dopasować dowolny pojedynczy znak NIE w nawiasach. kwantyfikator + zmusza go do traktowania kolejnych znaków jako pojedynczego dopasowania, tak że zamiana dokonywana jest dla pasującego podłańcucha, a nie dla każdego znaku z osobna.
W zależności od potrzeb, wybierz jeden z następujących regexów.
Aby usunąć niealfanumeryczne znaki, czyli wszystkie znaki oprócz liter i cyfr:
Wzór : [^0-9a-zA-Z]+.
Aby oczyścić wszystkie znaki oprócz liter , cyfry oraz miejsca :
Wzór : [^0-9a-zA-Z ]+.
Aby usunąć wszystkie znaki oprócz liter , cyfry oraz podkreślenie , możesz użyć \W, który oznacza dowolny znak, który NIE jest znakiem alfanumerycznym lub podkreśleniem:
Wzór : \W+
Jeśli chcesz zachować kilka innych postaci , np. znaki interpunkcyjne, umieść je wewnątrz nawiasów.
Na przykład, aby usunąć każdy znak inny niż litera, cyfra, kropka, przecinek lub spacja, użyj następującego regexu:
Wzór : [^0-9a-zA-Z, ]+.
To z powodzeniem eliminuje wszystkie znaki specjalne, ale dodatkowe białe przestrzenie pozostają.
Aby to naprawić, możesz zagnieździć powyższą funkcję w innej, która zastępuje wiele spacji pojedynczym znakiem spacji.
=RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")
Lub po prostu użyj natywnej funkcji TRIM z tym samym efektem:
=TRIM(RegExpReplace(A5, $A$2, ""))
Regex do usuwania znaków nienumerycznych
Aby usunąć wszystkie znaki nienumeryczne z ciągu, możesz użyć albo tej długiej formuły, albo jednego z bardzo prostych regexów wymienionych poniżej.
Dopasuj każdy znak, który NIE jest cyfrą:
Wzór : \D+
Usuwaj znaki nienumeryczne używając klas zanegowanych:
Wzór : [^0-9]+
Wzór : [^\d]+
Wskazówka. Jeśli Twoim celem jest usunięcie tekstu i rozlanie pozostałych liczb do osobnych komórek lub umieszczenie ich wszystkich w jednej komórce oddzielonych określonym delimiterem, to użyj funkcji RegExpExtract, jak wyjaśniono w Jak wyodrębnić liczby z łańcucha za pomocą wyrażeń regularnych.
Regex do usuwania wszystkiego po spacji
Aby wymazać wszystko po spacji, użyj znaku spacji ( ) lub białej spacji (ą), aby znaleźć pierwszą spację i .*, aby dopasować wszystkie znaki po niej.
W przypadku łańcuchów jednowierszowych, które zawierają tylko zwykłe spacje (wartość 32 w 7-bitowym systemie ASCII), nie ma znaczenia, którego z poniższych regexów użyjesz. W przypadku łańcuchów wielowierszowych ma to znaczenie.
Aby usunąć wszystko po znaku spacji , użyj tego regex:
Wzór : " .*"
=RegExpReplace(A5, " .*", "")
Ta formuła usunie wszystko po pierwszej spacji w każdy wiersz Aby wyniki były wyświetlane poprawnie, należy włączyć opcję Wrap Text.
Aby zdjąć wszystko po białej spacji (w tym spacja, tabulator, carriage return i nowa linia), regex to:
Wzór : \s.*
=RegExpReplace(A5, "\", "")
Ponieważ \u0026aposiada kilka różnych typów białych znaków, w tym nowa linia (ą), formuła ta usuwa wszystko po pierwszej spacji w komórce, niezależnie od tego, ile jest w niej wierszy.
Regex do usuwania tekstu po określonym znaku
Używając metod z poprzedniego przykładu, możesz usunąć tekst po dowolnym, określonym przez Ciebie znaku.
Aby obsłużyć każdą linię osobno:
Wzór ogólny : char.*
W łańcuchach jednowierszowych usunie to wszystko po char W łańcuchach wieloliniowych każdy wiersz będzie przetwarzany indywidualnie, ponieważ w smaku VBA Regex, kropka (.) pasuje do każdego znaku z wyjątkiem nowego wiersza.
Aby przetworzyć wszystkie linie jako pojedynczy łańcuch:
Wzór ogólny : char(.
Aby skasować wszystko po danym znaku, w tym nowe linie, do wzorca dodaje się ą.
Na przykład, aby usunąć tekst po pierwszym przecinku w ciągu, spróbuj tych wyrażeń regularnych:
Wzór : ,.*
Wzór : ,(.
Na poniższym zrzucie ekranu można zbadać, jak różnią się wyniki.
Regex do usuwania wszystkiego przed spacją
Podczas pracy z długimi ciągami tekstu czasami możesz chcieć je skrócić, usuwając tę samą część informacji we wszystkich komórkach. Poniżej omówimy dwa takie przypadki.
Usuń wszystko przed ostatnią spacją
Podobnie jak w poprzednim przykładzie, wyrażenie regularne zależy od twojego rozumienia "spacji".
Aby dopasować cokolwiek do ostatnia przestrzeń , ten regex zrobi (cudzysłów jest dodany, aby spacja po gwiazdce była zauważalna).
Wzór : ".* "
Aby dopasować wszystko przed ostatnia biała spacja (w tym spacja, tabulator, powrót karetki i nowa linia), użyj tego wyrażenia regularnego.
Wzór : .*\s
Różnica jest szczególnie widoczna na ciągach wieloliniowych.
Usuń wszystko przed pierwszą spacją
Aby dopasować wszystko do pierwszej spacji w łańcuchu, możesz użyć tego wyrażenia regularnego:
Wzór : ^[^ ]* +
Od początku łańcucha ^, dopasowujemy zero lub więcej znaków nie będących spacjami [^ ]*, po których natychmiast następuje jedna lub więcej spacji " +". Ostatnia część jest dodawana, aby zapobiec potencjalnym wiodącym spacjom w wynikach.
Aby usunąć tekst przed pierwszą spacją w każdym wierszu, formuła jest zapisywana w domyślnym trybie "wszystkie dopasowania" ( instancja_numer pominięto):
=RegExpReplace(A5, "^[^ ]* +", "")
Aby usunąć tekst przed pierwszą spacją w pierwszym wierszu i pozostawić wszystkie pozostałe wiersze nienaruszone, należy użyć polecenia instancja_numer argument jest ustawiony na 1:
=RegExpReplace(A5, "^[^ ]* +", "", 1)
Regex do usuwania wszystkiego przed znakiem
Najprostszym sposobem na usunięcie całego tekstu przed określonym znakiem jest użycie regexu, takiego jak ten:
Wzór ogólny : ^[^char]*char
Przetłumaczone na ludzki język, mówi: "od początku łańcucha zakotwiczonego przez ^, dopasuj 0 lub więcej znaków z wyjątkiem char [^char]* do pierwszego wystąpienia char .
Na przykład, aby usunąć cały tekst przed pierwszym dwukropkiem, użyj tego wyrażenia regularnego:
Wzór : ^[^:]*:
Aby uniknąć wiodących spacji w wynikach, dodaj na koniec znak białej spacji, co spowoduje usunięcie wszystkiego przed pierwszym dwukropkiem i obcięcie wszelkich spacji tuż po nim:
Wzór : ^[^:]*:\s*
=RegExpReplace(A5, "^[^:]*:^", "")
Porada Oprócz wyrażeń regularnych Excel ma własne sposoby na usuwanie tekstu według pozycji lub dopasowania. Aby dowiedzieć się, jak zrealizować to zadanie za pomocą natywnych formuł, zobacz Jak usunąć tekst przed lub po znaku w Excelu.
Regex, aby usunąć wszystko z wyjątkiem
Aby wyeliminować wszystkie znaki z łańcucha oprócz tych, które chcesz zachować, użyj klas znaków zanegowanych.
Na przykład, aby usunąć wszystkie znaki z wyjątkiem małych liter i kropek, regex to:
Wzór : [^a-z]+.
W rzeczywistości moglibyśmy obejść się bez kwantyfikatora +, ponieważ nasza funkcja zastępuje wszystkie znalezione dopasowania. Kwantyfikator po prostu czyni to trochę szybszym - zamiast obsługiwać każdy pojedynczy znak, zastępujesz podłańcuch.
=RegExpReplace(A5, "[^a-z]+", "")
Regex do usuwania znaczników html w Excelu
Po pierwsze, należy zauważyć, że HTML nie jest językiem regularnym, więc parsowanie go za pomocą wyrażeń regularnych nie jest najlepszym sposobem, ale regexes mogą zdecydowanie pomóc w usunięciu tagów z komórek, aby uczynić zbiór danych czystszym.
Biorąc pod uwagę, że znaczniki html są zawsze umieszczane w nawiasach kątowych , można je znaleźć za pomocą jednego z następujących regexów.
Klasa zanegowana:
Wzór : ]*>
Tutaj dopasowujemy otwierający nawias kątowy, po którym następuje zero lub więcej wystąpień dowolnego znaku z wyjątkiem zamykającego nawiasu kątowego [^>]* aż do najbliższego zamykającego nawiasu kątowego.
Leniwe wyszukiwanie:
Wzór :
Tutaj dopasowujemy wszystko od pierwszego nawiasu otwierającego do pierwszego nawiasu zamykającego. Znak zapytania zmusza .* do dopasowania jak najmniejszej liczby znaków, aż znajdzie nawias zamykający.
Niezależnie od tego, który wzór wybierzesz, rezultat będzie absolutnie taki sam.
Na przykład, aby usunąć wszystkie znaczniki html z ciągu w A5 i pozostawić tekst, formuła to:
=RegExpReplace(A5, "]*>", "")
Lub możesz użyć leniwego kwantyfikatora, jak pokazano na zrzucie ekranu:
Rozwiązanie to działa doskonale dla pojedynczych tekstów (wiersze 5 - 9). Dla tekstów wielokrotnych (wiersze 10 - 12) wyniki są dyskusyjne - teksty z różnych tagów są łączone w jeden. Czy jest to poprawne, czy nie? Obawiam się, że nie jest to coś, co można łatwo rozstrzygnąć - wszystko zależy od rozumienia pożądanego wyniku. Na przykład w B11 oczekuje się wyniku "A1"; podczas gdy w B10 można chcieć"dane1" i "dane2" należy oddzielić spacją.
Aby usunąć znaczniki html i oddzielić pozostałe teksty spacjami, można postępować w ten sposób:
- Zastąp tagi spacjami " ", a nie pustymi ciągami:
=RegExpReplace(A5, "]*>", " ")
- Zmniejszenie wielu spacji do pojedynczego znaku spacji:
=RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")
- Przytnij wiodące i końcowe spacje:
=TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))
Wynik będzie wyglądał coś takiego:
Ablebits Regex Remove Tool
Jeśli miałeś okazję korzystać z naszego pakietu Ultimate Suite dla Excela, prawdopodobnie odkryłeś już nowe narzędzia Regex wprowadzone wraz z ostatnią wersją. Piękno tych funkcji Regex opartych na technologii .NET polega na tym, że po pierwsze obsługują one w pełni funkcjonalną składnię wyrażeń regularnych bez ograniczeń VBA RegExp, a po drugie nie wymagają wstawiania żadnego kodu VBA do skoroszytów, ponieważ cała integracja kodu odbywa sięprzez nas na zapleczu.
Twoją częścią pracy jest skonstruowanie wyrażenia regularnego i podanie go do funkcji :) Pokażę Ci jak to zrobić na praktycznym przykładzie.
Jak usunąć tekst w nawiasach i nawiasach za pomocą regex
W długich ciągach tekstowych mniej ważne informacje często są ujęte w [nawiasy] i (nawiasy). Jak usunąć te nieistotne szczegóły zachowując wszystkie inne dane?
W rzeczywistości zbudowaliśmy już podobny regex do usuwania znaczników html, czyli tekstu wewnątrz nawiasów kątowych. Oczywiście te same metody będą działać również dla nawiasów kwadratowych i okrągłych.
Wzór : (\(.*?\))
Sztuczka polega na użyciu leniwego kwantyfikatora (*?), aby dopasować najkrótszy możliwy podłańcuch. Pierwsza grupa (\(.*?\)) dopasowuje wszystko od nawiasu otwierającego do pierwszego nawiasu zamykającego. Druga grupa (\[.*?\]) dopasowuje wszystko od nawiasu otwierającego do pierwszego nawiasu zamykającego. Pionowy pasek
Mając określony wzór, "nakarmmy" go naszą funkcją Regex Remove. Oto jak:
- Na Dane Ablebits zakładka, w Tekst grupa, kliknij Narzędzia Regex .
Aby uzyskać wyniki w postaci formuł, a nie wartości, należy wybrać opcję Wstaw jako wzór pole wyboru.
Aby usunąć tekst w nawiasach z ciągów w A2:A5, konfigurujemy ustawienia w następujący sposób:
W rezultacie AblebitsRegexRemove funkcja jest wstawiana do nowej kolumny obok oryginalnych danych.
Funkcję można również wprowadzić bezpośrednio do komórki za pomocą standardowego Funkcja wstawiania okna dialogowego, gdzie jest on skategoryzowany pod AblebitsUDFs .
Jak AblebitsRegexRemove jest przeznaczony do usuwania tekstu, wymaga tylko dwóch argumentów - ciągu źródłowego i regex. Oba parametry mogą być zdefiniowane bezpośrednio w formule lub dostarczone w postaci odniesień do komórek. W razie potrzeby ta niestandardowa funkcja może być używana razem z dowolnymi natywnymi.
Na przykład, aby przyciąć dodatkowe spacje w wynikowych łańcuchach, możesz wykorzystać funkcję TRIM jako wrapper:
=TRIM(AblebitsRegexRemove(A5, $A$2))
Tak wygląda usuwanie ciągów w Excelu za pomocą wyrażeń regularnych. Dziękuję za przeczytanie i czekam na Ciebie na naszym blogu za tydzień!
Dostępne pliki do pobrania
Usuwanie ciągów znaków za pomocą regex - przykłady (plik .xlsm)
Ultimate Suite - wersja próbna (plik .exe)