Regex за премахване на определени символи или текст в Excel

  • Споделя Това
Michael Brown

Мислили ли сте си някога колко мощен би бил Excel, ако някой можеше да обогати инструментариума му с регулярни изрази? Ние не само мислехме, но и работихме върху това :) И сега можете да добавите тази чудесна функция RegEx към собствените си работни книги и да изтриете поднизове, които отговарят на даден модел, за нула време!

Миналата седмица разгледахме как да използваме регулярни изрази, за да заместваме низове в Excel. За целта създадохме потребителска функция Regex Replace. Оказа се, че функцията излиза извън рамките на основното си предназначение и може не само да замества низове, но и да ги премахва. Как би могло да стане това? По отношение на Excel премахването на стойност не е нищо друго освен заместването ѝ с празен низ, нещо, което нашата функция Regex емного добър в!

    Функция VBA RegExp за премахване на поднизове в Excel

    Както всички знаем, регулярните изрази не се поддържат в Excel по подразбиране. За да ги активирате, трябва да създадете своя собствена функция, дефинирана от потребителя. Добрата новина е, че такава функция вече е написана, тествана и готова за използване. Всичко, което трябва да направите, е да копирате този код, да го поставите във вашия VBA редактор и след това да запазите файла като работна книга с активирани макроси (.xlsm).

    Функцията има следния синтаксис:

    RegExpReplace(текст, шаблон, замяна, [instance_num], [match_case])

    Първите три аргумента са задължителни, а последните два са незадължителни.

    Къде:

    • Текст - текстовия низ, в който ще се търси.
    • Модел - регулярния израз за търсене.
    • Смяна на - текстът, с който да се замени. Към премахване на поднизове отговарящи на шаблона, използвайте празен низ ("") за замяна.
    • Instance_num (незадължително) - екземплярът, който да се замени. Ако не се посочи, се заместват всички намерени съвпадения (по подразбиране).
    • Match_case (незадължително) - булева стойност, указваща дали да се съпоставят или пренебрегват регистрите на текста. За съпоставяне с отчитане на регистрите използвайте TRUE (по подразбиране); за съпоставяне без отчитане на регистрите - FALSE.

    За повече информация вижте функцията RegExpReplace.

    Съвет. В обикновени случаи можете да премахвате определени символи или думи от клетките с помощта на формули на Excel. Но регулярните изрази предоставят много повече възможности за това.

    Как да премахваме низове с помощта на регулярни изрази - примери

    Както беше споменато по-горе, за да премахнете части от текста, които отговарят на даден шаблон, трябва да ги замените с празен низ. Така че общата формула има следната форма:

    RegExpReplace(текст, шаблон, "", [instance_num], [match_case])

    Примерите по-долу показват различни реализации на тази основна концепция.

    Премахване на всички съвпадения или конкретно съвпадение

    Функцията RegExpReplace е предназначена за намиране на всички поднизове, съответстващи на даден регекс. Кои появявания да се премахнат се контролира от четвъртия незадължителен аргумент, наречен instance_num .

    По подразбиране е "всички съвпадения" - когато instance_num Ако аргументът е пропуснат, всички намерени съвпадения се изтриват. За да изтриете конкретно съвпадение, задайте номера на инстанцията.

    Предположете, че в низовете по-долу искате да изтриете номера на първата поръчка. Всички такива номера започват със знака хеш (#) и съдържат точно 5 цифри. Така че можем да ги идентифицираме с помощта на този регекс:

    Модел : #\d{5}\b

    Границата на думата \b указва, че съвпадащият подниз не може да бъде част от по-голям низ, например #10000001.

    За да премахнете всички съвпадения, бутонът instance_num аргументът не е дефиниран:

    =RegExpReplace(A5, "#\d{5}\b", "")

    За да изкореним само първата поява, задаваме instance_num на 1:

    =RegExpReplace(A5, "#\d{5}\b", "", 1)

    Regex за премахване на определени символи

    За да премахнете определени символи от даден низ, просто запишете всички нежелани символи и ги разделете с вертикална черта.

    Например, за да стандартизираме телефонните номера, записани в различни формати, първо трябва да премахнем определени символи, като скоби, тирета, точки и бели полета.

    Модел : \(

    =RegExpReplace(A5, "\(

    Резултатът от тази операция е 10-цифрено число, например "1234567890".

    За удобство можете да въведете регекса в отделна клетка и да се позовавате на тази клетка с помощта на абсолютна референция, например $A$2:

    =RegExpReplace(A5, $A$2, "")

    След това можете да стандартизирате форматирането по желания от вас начин, като използвате оператора за конкатенация (&) и текстовите функции, като RIGHT, MID и LEFT.

    Например, за да запишете всички телефонни номера във формат (123) 456-7890, формулата е:

    ="("&LEFT(B5, 3)&") "&MID(B5, 4, 3)&"-"&RIGHT(B5, 4)

    Където B5 е изходът на функцията RegExpReplace.

    Премахване на специални символи с помощта на regex

    В едно от нашите ръководства разгледахме как да премахваме нежелани символи в Excel с помощта на вградени и потребителски функции. Регулярните изрази правят нещата много по-лесни! Вместо да изброявате всички символи за изтриване, просто посочете тези, които искате да запазите :)

    Моделът се основава на класове отрицателни символи - карета се поставя вътре в класа от символи [^ ], за да съвпадне с всеки единичен символ, който НЕ е в скоби. Квантификаторът + го принуждава да разглежда последователни символи като единично съвпадение, така че замяната се извършва за съвпадащия подниз, а не за всеки отделен символ.

    В зависимост от нуждите си изберете един от следните регексове.

    За да премахнете небуквено-цифрови т.е. всички символи, с изключение на буквите и цифрите:

    Модел : [^0-9a-zA-Z]+

    Изчистване на всички символи с изключение на буквите , цифри и пространства :

    Модел : [^0-9a-zA-Z ]+

    Изтриване на всички символи с изключение на буквите , цифри и Подчертаване , можете да използвате \W, което означава всеки символ, който НЕ е буквено-цифров символ или долна черта:

    Модел : \W+

    Ако искате да запазване на някои други герои , например препинателни знаци, поставете ги в скобите.

    Например, за да премахнете всеки символ, различен от буква, цифра, точка, запетая или интервал, използвайте следния регекс:

    Модел : [^0-9a-zA-Z\., ]+

    По този начин успешно се елиминират всички специални символи, но остава допълнителен бял интервал.

    За да поправите това, можете да вмъкнете горната функция в друга, която замества множество интервали с един символ интервал.

    =RegExpReplace(RegExpReplace(A5,$A$2,""), " +", " ")

    Или просто използвайте собствената функция TRIM със същия ефект:

    =TRIM(RegExpReplace(A5, $A$2, ""))

    Regex за премахване на нецифрови символи

    За да изтриете всички нецифрови символи от даден низ, можете да използвате или тази дълга формула, или един от много простите регекси, изброени по-долу.

    Съчетава всеки символ, който НЕ е цифра:

    Модел : \D+

    Премахване на нецифрови символи с помощта на отрицателни класове:

    Модел : [^0-9]+

    Модел : [^\d]+

    Съвет. Ако целта ви е да премахнете текста и да изсипете останалите числа в отделни клетки или да ги поставите всички в една клетка, разделени с определен разделител, тогава използвайте функцията RegExpExtract, както е обяснено в Как да извлечем числа от низ с помощта на регулярни изрази.

    Регекс за премахване на всичко след интервала

    За да изтриете всичко след интервал, използвайте символа за интервал ( ) или за бял интервал (\s), за да намерите първия интервал, и .*, за да съчетаете всички символи след него.

    Ако имате едноредови низове, които съдържат само нормални интервали (стойност 32 в 7-битовата система ASCII), няма значение кой от изброените по-долу регекси ще използвате. При многоредови низове това е от значение.

    За да премахнете всичко след символ интервал , използвайте този регекс:

    Модел : " .*"

    =RegExpReplace(A5, " .*", "")

    Тази формула ще премахне всичко след първия интервал в всеки ред . За да се покажат правилно резултатите, не забравяйте да включите опцията Wrap Text (Обвиване на текста).

    Да свалите всичко след бял интервал (включително интервал, табулация, връщане на каретка и нов ред), регексът е:

    Модел : \s.*

    =RegExpReplace(A5, "\s.*", "")

    Тъй като \s съвпада с няколко различни типа бели полета, включително нов ред (\n), тази формула изтрива всичко след първия интервал в клетката, без значение колко реда има в нея.

    Regex за премахване на текст след определен символ

    Използвайки методите от предишния пример, можете да изтриете текст след всеки зададен от вас символ.

    За да обработвате всеки ред поотделно:

    Общ модел : char.*

    В едноредови низове това ще премахне всичко след char В многоредови низове всеки ред се обработва поотделно, тъй като в аромата на VBA Regex точката (.) съвпада с всеки символ с изключение на нов ред.

    Обработване на всички редове като един низ:

    Общ модел : char(.

    За да изтриете всичко след даден символ, включително нови редове, към шаблона се добавя \n.

    Например, за да премахнете текста след първата запетая в даден низ, опитайте тези регулярни изрази:

    Модел : ,.*

    Модел : ,(.

    На скрийншота по-долу можете да видите как се различават резултатите.

    Регекс за премахване на всичко преди интервала

    Когато работите с дълги низове от текст, понякога може да искате да ги съкратите, като премахнете една и съща част от информацията във всички клетки. По-долу ще разгледаме два такива случая.

    Премахнете всичко преди последното място

    Както и в предишния пример, регулярният израз зависи от разбирането ви за "интервал".

    За да съчетаете всичко с последно място (кавичките са добавени, за да се забележи интервалът след звездичка).

    Модел : ".* "

    За да съответства на всичко преди последен бял интервал (включително интервал, табулация, връщане на карета и нов ред), използвайте този регулярен израз.

    Модел : .*\s

    Разликата е особено забележима при многоредови низове.

    Премахване на всичко преди първия интервал

    За да съответствате на всичко до първия интервал в даден низ, можете да използвате този регулярен израз:

    Модел : ^[^ ]* +

    От началото на символния низ ^, ние сравняваме нула или повече символи без интервал [^ ]*, които са непосредствено последвани от един или повече интервали " +". Последната част се добавя, за да се предотвратят потенциални водещи интервали в резултатите.

    За да се премахне текстът преди първия интервал във всеки ред, формулата се записва в режим по подразбиране "всички съвпадения" ( instance_num пропуснато):

    =RegExpReplace(A5, "^[^ ]* +", "")

    За да изтриете текста преди първия интервал в първия ред и да оставите всички останали редове непокътнати, използвайте instance_num се задава стойност 1:

    =RegExpReplace(A5, "^[^ ]* +", "", 1)

    Регекс за премахване на всичко преди символа

    Най-лесният начин за премахване на целия текст преди определен символ е чрез използване на регекс, например:

    Общ модел : ^[^char]*char

    Преведена на човешки език, тя гласи: "от началото на низ, закотвен с ^, съвпадайте с 0 или повече символа, с изключение на char [^char]* до първата поява на char .

    Например, за да изтриете целия текст преди първото двоеточие, използвайте този регулярен израз:

    Модел : ^[^:]*:

    За да избегнете водещи интервали в резултатите, добавете в края на символа за бял интервал \s*. Това ще премахне всичко преди първото двоеточие и ще изреже всички интервали непосредствено след него:

    Модел : ^[^:]*:\s*

    =RegExpReplace(A5, "^[^:]*:\s*", "")

    Съвет: Освен с регулярни изрази, Excel разполага със собствени средства за премахване на текст по позиция или съвпадение. За да научите как да изпълните задачата с помощта на собствени формули, вижте Как да премахнем текст преди или след символ в Excel.

    Регекс за премахване на всичко освен

    За да изтриете всички символи от даден низ, освен тези, които искате да запазите, използвайте класове с отрицателни символи.

    Например, за да премахнете всички символи с изключение на малките букви и точките, регексът е:

    Модел : [^a-z\.]+

    Всъщност тук можем да минем и без квантификатора +, тъй като нашата функция замества всички намерени съвпадения. Квантификаторът просто я прави малко по-бърза - вместо да обработвате всеки отделен символ, замествате подниз.

    =RegExpReplace(A5, "[^a-z\.]+", "")

    Regex за премахване на html тагове в Excel

    Първо, трябва да се отбележи, че HTML не е регулярен език, така че анализирането му с помощта на регулярни изрази не е най-добрият начин. Въпреки това, регексите определено могат да помогнат за премахване на тагове от клетките, за да направите набора от данни по-чист.

    Като се има предвид, че html таговете винаги се поставят в ъглови скоби , можете да ги намерите, като използвате един от следните регекси.

    Отрицателен клас:

    Модел : ]*>

    Тук се съпоставя начална ъглова скоба, последвана от нула или повече срещания на всеки символ, с изключение на затварящата ъглова скоба [^>]*, до най-близката затваряща ъглова скоба.

    Мързеливо търсене:

    Модел :

    Тук се сравнява всичко от първата отваряща скоба до първата затваряща скоба. Въпросителният знак принуждава .* да сравнява възможно най-малко символи, докато намери затваряща скоба.

    Който и модел да изберете, резултатът ще бъде абсолютно еднакъв.

    Например, за да премахнете всички html тагове от низ в A5 и да оставите текст, формулата е:

    =RegExpReplace(A5, "]*>", "")

    Или можете да използвате мързеливия квантификатор, както е показано на снимката:

    Това решение работи перфектно за единичен текст (редове 5 - 9). За множество текстове (редове 10 - 12) резултатите са съмнителни - текстовете от различни тагове се обединяват в един. Правилно ли е това или не? Опасявам се, че не е нещо, което може да се реши лесно - всичко зависи от разбирането ви за желания резултат. Например в B11 се очаква резултатът "A1"; докато в B10 може да искате"data1" и "data2" трябва да бъдат разделени с интервал.

    За да премахнете html таговете и да разделите останалите текстове с интервали, можете да процедирате по следния начин:

    1. Заменяйте таговете с интервали " ", а не с празни низове:

      =RegExpReplace(A5, "]*>", " ")

    2. Намаляване на множеството интервали до един символ за интервал:

      =RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " ")

    3. Отрежете началните и крайните интервали:

      =TRIM(RegExpReplace(RegExpReplace(A5, "]*>", " "), " +", " "))

    Резултатът ще изглежда по следния начин:

    Инструмент за премахване на регетове Ablebits

    Ако сте имали възможност да използвате нашия Ultimate Suite за Excel, вероятно вече сте открили новите Regex Tools, въведени с последната версия. Хубавото на тези .NET базирани Regex функции е, че те, първо, поддържат пълноценен синтаксис на регулярни изрази без ограниченията на VBA RegExp и, второ, не изискват вмъкване на VBA код в работните ви книги, тъй като цялата интеграция на кода се извършваот нас на гърба.

    Вашата задача е да конструирате регулярен израз и да го подадете на функцията :) Нека ви покажа как да направите това на практически пример.

    Как да премахнете текст в скоби и скоби с помощта на regex

    В дълги текстови низове по-маловажната информация често е затворена в [скоби] и (скоби). Как да премахнете тези несъществени детайли, като запазите всички останали данни?

    Всъщност вече създадохме подобен регекс за изтриване на html тагове, т.е. текст в ъглови скоби. Очевидно същите методи ще работят и за квадратни и кръгли скоби.

    Модел : (\(.*?\))

    Трикът се състои в използването на мързелив квантификатор (*?), за да съответства на възможно най-краткия подниз. Първата група (\(.*?\)) съответства на всичко от отваряща скоба до първата затваряща скоба. Втората група (\[.*?\]) съответства на всичко от отваряща скоба до първата затваряща скоба.

    След като определим модела, нека го подадем на нашата функция Regex Remove. Ето как:

    1. На Данни от Ablebits в раздела Текст група, щракнете върху Инструменти за регексиране .

  • На Инструменти за регексиране изберете изходните низове, въведете регекса, изберете Премахване на и натиснете Премахване на .

    За да получите резултатите като формули, а не като стойности, изберете Вмъкване като формула квадратчето за отметка.

    За да премахнем текста в скоби от низовете в A2:A5, конфигурираме настройките по следния начин:

  • В резултат на това AblebitsRegexRemove се вмъква в нова колона до първоначалните данни.

    Функцията може да бъде въведена и директно в клетка чрез стандартния Функция за вмъкване диалоговия прозорец, където е категоризиран под AblebitsUDFs .

    Като AblebitsRegexRemove е предназначена за премахване на текст и изисква само два аргумента - изходния низ и regex-а. Двата параметъра могат да бъдат дефинирани директно във формула или предоставени под формата на препратки към клетки. Ако е необходимо, тази потребителска функция може да се използва заедно с всички местни функции.

    Например за изрязване на допълнителни интервали в получените низове можете да използвате функцията TRIM като обвивка:

    =TRIM(AblebitsRegexRemove(A5, $A$2))

    Това е начинът за премахване на низове в Excel с помощта на регулярни изрази. Благодаря ви, че прочетохте, и с нетърпение очаквам да ви видя в нашия блог следващата седмица!

    Налични изтегляния

    Премахване на низове с помощта на regex - примери (.xlsm файл)

    Ultimate Suite - пробна версия (.exe файл)

    Майкъл Браун е отдаден технологичен ентусиаст със страст към опростяване на сложни процеси с помощта на софтуерни инструменти. С повече от десетилетие опит в технологичната индустрия, той е усъвършенствал уменията си в Microsoft Excel и Outlook, както и в Google Sheets и Docs. Блогът на Майкъл е посветен на споделянето на неговите знания и опит с други, предоставяйки лесни за следване съвети и уроци за подобряване на продуктивността и ефективността. Независимо дали сте опитен професионалист или начинаещ, блогът на Michael предлага ценни прозрения и практически съвети за извличане на максимума от тези основни софтуерни инструменти.