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

  • Поделись Этим
Michael Brown

Думали ли вы когда-нибудь, насколько мощным был бы Excel, если бы кто-то обогатил его инструментарий регулярными выражениями? Мы не только думали, но и работали над этим :) И теперь вы можете добавить эту замечательную функцию RegEx в свои рабочие книги и стирать подстроки, соответствующие шаблону, в мгновение ока!

На прошлой неделе мы рассмотрели, как использовать регулярные выражения для замены строк в Excel. Для этого мы создали пользовательскую функцию Regex Replace. Как оказалось, эта функция выходит за рамки своего основного назначения и может не только заменять строки, но и удалять их. Как это возможно? В терминах Excel удаление значения - это не что иное, как замена его пустой строкой, чем и является наша функция Regex.очень хорошо!

    Функция VBA RegExp для удаления подстрок в Excel

    Как мы все знаем, регулярные выражения не поддерживаются в Excel по умолчанию. Чтобы включить их, вам нужно создать собственную пользовательскую функцию. Хорошая новость заключается в том, что такая функция уже написана, протестирована и готова к использованию. Все, что вам нужно сделать, это скопировать этот код, вставить его в редактор VBA, а затем сохранить файл как рабочая книга с поддержкой макросов (.xlsm).

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

    RegExpReplace(text, pattern, replacement, [instance_num], [match_case])

    Первые три аргумента являются обязательными, последние два - необязательными.

    Где:

    • Текст - текстовая строка для поиска.
    • Узор - регулярное выражение для поиска.
    • Замена - текст, на который нужно заменить. To удалить подстроки соответствующие шаблону, используйте пустая строка ("") для замены.
    • Номер_экземпляра (необязательно) - экземпляр для замены. Если опущено, заменяются все найденные совпадения (по умолчанию).
    • Соответствие_случаю (необязательный) - булево значение, указывающее, следует ли сопоставлять или игнорировать регистр текста. Для сопоставления с учетом регистра используйте TRUE (по умолчанию); для сопоставления без учета регистра - FALSE.

    Для получения дополнительной информации см. функцию RegExpReplace.

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

    Как удалить строки с помощью регулярных выражений - примеры

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

    RegExpReplace(text, pattern, "", [instance_num], [match_case])

    В приведенных ниже примерах показаны различные реализации этой базовой концепции.

    Удалить все совпадения или конкретное совпадение

    Функция RegExpReplace предназначена для поиска всех подстрок, соответствующих заданному regex. То, какие вхождения удалять, контролируется 4-м необязательным аргументом, названным номер экземпляра .

    По умолчанию используется значение "все совпадения" - когда номер экземпляра аргумент опущен, все найденные совпадения удаляются. Чтобы удалить конкретное совпадение, определите номер экземпляра.

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

    Узор : #\d{5}\b

    Граница слова \b указывает, что совпадающая подстрока не может быть частью большей строки, такой как #10000001.

    Чтобы удалить все совпадения, выберите номер экземпляра аргумент не определен:

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

    Чтобы искоренить только первое появление, мы устанавливаем номер экземпляра аргумент к 1:

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

    Regex для удаления определенных символов

    Чтобы удалить определенные символы из строки, просто запишите все ненужные символы и отделите их вертикальной полосой

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

    Узор : \(

    =RegExpReplace(A5, "\(

    Результатом этой операции является 10-значное число, например "1234567890".

    Для удобства вы можете ввести regex в отдельную ячейку и сослаться на нее с помощью абсолютной ссылки, например, $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, как описано в разделе Как извлечь числа из строки с помощью регулярных выражений.

    Regex для удаления всего, что находится после пробела

    Чтобы удалить все после пробела, используйте пробел ( ) или пробельные символы (\s) для поиска первого пробела и .* для соответствия всем символам после него.

    Если у вас однострочные строки, содержащие только обычные пробелы (значение 32 в 7-битной системе ASCII), не имеет значения, какой из приведенных ниже регексов вы используете. В случае многострочных строк это имеет значение.

    Чтобы удалить все после символа пробела используйте этот регекс:

    Узор : " .*"

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

    Эта формула удалит все, что находится после первого пробела в каждая строка Чтобы результаты отображались правильно, обязательно включите функцию Wrap Text.

    Чтобы снять все после пробела (включая пробел, табуляцию, возврат каретки и новую строку), регекс будет:

    Узор : \s.*

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

    Поскольку \s сопоставляет несколько различных типов пробелов, включая новая линия (\n), эта формула удаляет все, что находится после первого пробела в ячейке, независимо от того, сколько в ней строк.

    Regex для удаления текста после определенного символа

    Используя методы из предыдущего примера, вы можете удалить текст после любого указанного вами символа.

    Чтобы обрабатывать каждую строку отдельно:

    Общий шаблон : char.*

    В однострочных строках это приведет к удалению всего, что находится после char В многострочных строках каждая строка будет обрабатываться отдельно, поскольку в VBA Regex точка (.) соответствует любому символу, кроме новой строки.

    Чтобы обработать все строки как одну строку:

    Общий шаблон : char(.

    Для удаления всего, что находится после данного символа, включая новые строки, к шаблону добавляется \n.

    Например, чтобы удалить текст после первой запятой в строке, попробуйте использовать следующие регулярные выражения:

    Узор : ,.*

    Узор : ,(.

    На скриншоте ниже вы можете увидеть, как различаются результаты.

    Regex для удаления всего, что находится перед пробелом

    При работе с длинными строками текста иногда возникает желание сделать их короче, удалив одну и ту же часть информации во всех ячейках. Ниже мы рассмотрим два таких случая.

    Удалите все, что находится перед последним пробелом

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

    Чтобы сопоставить что-либо с последнее место , подойдет этот regex (кавычки добавлены, чтобы сделать пробел после звездочки заметным).

    Узор : ".* "

    Для соответствия всему, что находится перед последний пробел (включая пробел, табуляцию, возврат каретки и новую строку), используйте это регулярное выражение.

    Узор : .*\s

    Разница особенно заметна на многострочных строках.

    Удалите все, что находится перед первым пробелом

    Для сопоставления всего до первого пробела в строке можно использовать это регулярное выражение:

    Узор : ^[^ ]* +

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

    Чтобы удалить текст до первого пробела в каждой строке, формула записывается в режиме "все совпадения" по умолчанию ( номер экземпляра опущено):

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

    Чтобы удалить текст до первого пробела в первой строке, оставив все остальные строки нетронутыми, выполните команду номер экземпляра аргумент устанавливается в 1:

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

    Regex для удаления всего, что находится перед символом

    Самый простой способ удалить весь текст перед определенным символом - это использовать регекс, подобный этому:

    Общий шаблон : ^[^char]*char

    В переводе на человеческий язык это звучит так: "начиная с начала строки, закрепленной символом ^, сопоставьте 0 или более символов, за исключением char [^char]* до первого появления char .

    Например, чтобы удалить весь текст перед первым двоеточием, используйте следующее регулярное выражение:

    Узор : ^[^:]*:

    Чтобы избежать пробелов в результатах, добавьте в конец символ пробела \s*. Это удалит все до первого двоеточия и обрежет все пробелы сразу после него:

    Узор : ^[^:]*:\s*

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

    Совет. Помимо регулярных выражений, Excel имеет собственные средства удаления текста по позиции или совпадению. Чтобы узнать, как выполнить эту задачу с помощью собственных формул, см. статью Как удалить текст до или после символа в Excel.

    Regex для удаления всего, кроме

    Чтобы удалить из строки все символы, кроме тех, которые вы хотите оставить, используйте классы отрицаемых символов.

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

    Узор : [^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 Regex Remove Tool

    Если у вас был шанс использовать наш Ultimate Suite для Excel, вы, вероятно, уже обнаружили новые инструменты Regex, представленные в недавнем выпуске. Прелесть этих функций Regex на базе .NET в том, что они, во-первых, поддерживают полнофункциональный синтаксис регулярных выражений, свободный от ограничений VBA RegExp, а во-вторых, не требуют вставки кода VBA в ваши рабочие книги, поскольку вся интеграция кода происходит в процессе работы.нами с обратной стороны.

    Ваша часть работы заключается в том, чтобы построить регулярное выражение и передать его функции :) Позвольте мне показать вам, как это сделать на практическом примере.

    Как удалить текст в скобках и круглых скобках с помощью regex

    В длинных текстовых строках менее важная информация часто заключена в [скобки] и (круглые скобки). Как удалить эти несущественные детали, сохранив все остальные данные?

    На самом деле, мы уже создали аналогичный regex для удаления html-тегов, т.е. текста в угловых скобках. Очевидно, что те же методы будут работать и для квадратных и круглых скобок.

    Узор : (\(.*?\))

    Хитрость заключается в использовании ленивого квантификатора (*?) для поиска кратчайшей подстроки. Первая группа (\(.*?\)) соответствует всему от открывающей скобки до первой закрывающей скобки. Вторая группа (\[.*?\]) соответствует всему от открывающей скобки до первой закрывающей скобки. Вертикальный бар

    Когда шаблон определен, давайте "скормим" его нашей функции Regex Remove. Вот как это сделать:

    1. На Ablebits Data во вкладке Текст группу, нажмите Инструменты регекса .

  • На Инструменты регекса панели, выберите исходные строки, введите регекс, выберите Удалить и нажмите кнопку Удалить .

    Чтобы получить результаты в виде формул, а не значений, выберите параметр Вставка в виде формулы флажок.

    Чтобы удалить текст в скобках из строк в A2:A5, мы настроим параметры следующим образом:

  • В результате AblebitsRegexRemove функция вставляется в новый столбец рядом с исходными данными.

    Функцию также можно ввести непосредственно в ячейку с помощью стандартной функции Функция вставки диалоговое окно, где он находится в категории AblebitsUDFs .

    Как AblebitsRegexRemove предназначена для удаления текста, она требует только два аргумента - исходную строку и regex. Оба параметра могут быть заданы непосредственно в формуле или предоставлены в виде ссылок на ячейки. При необходимости эта пользовательская функция может быть использована вместе с любой встроенной.

    Например, чтобы обрезать лишние пробелы в результирующих строках, можно использовать функцию TRIM в качестве обертки:

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

    Вот как удалить строки в Excel с помощью регулярных выражений. Я благодарю вас за чтение и жду вас на нашем блоге на следующей неделе!

    Доступные загрузки

    Удаление строк с помощью regex - примеры (файл.xlsm)

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

    Майкл Браун — увлеченный технологический энтузиаст, стремящийся упростить сложные процессы с помощью программных инструментов. Имея более чем десятилетний опыт работы в технологической отрасли, он отточил свои навыки в Microsoft Excel и Outlook, а также в Google Sheets и Docs. Блог Майкла посвящен тому, чтобы делиться своими знаниями и опытом с другими, предоставляя простые советы и учебные пособия для повышения производительности и эффективности. Являетесь ли вы опытным профессионалом или новичком, в блоге Майкла вы найдете ценную информацию и практические советы, которые помогут вам максимально эффективно использовать эти важные программные инструменты.