Regex in excel replace

Skip to content

Поиск и замена в Excel с помощью регулярных выражений

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

Когда дело доходит до замены одного фрагмента текста другим, Microsoft Excel предоставляет ряд опций на выбор, включая инструмент «Найти и заменить» и несколько текстовых функций замены. Зачем кому-то усложнять ситуацию с помощью регулярных выражений? Но дело в том, что стандартные функции Excel могут обрабатывать только ту строку текста, которую вы явным образом укажете. Чтобы найти строку, соответствующую некоторому шаблону, и заменить ее чем-то другим, необходимы регулярные выражения.

Вот о чем мы будем говорить в этой статье:

  • Функция замены при помощи регулярных выражений Excel VBA
  • Замена текста, соответствующего шаблону
  • Замена чисел в тексте
  • Заменить денежные суммы
  • Поиск и замена всех совпадений
  • Замена определенного по счёту экземпляра
  • Поиск и замена в Excel с помощью Regex Tools

Регулярное выражение – это шаблон, состоящий из последовательности символов, который можно использовать для поиска соответствующих символов в тексте.

Функция замены при помощи регулярных выражений Excel VBA

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


Public Function RegExpReplace(text As String, pattern As String, text_replace As String, Optional instance_num As Integer = 0, Optional match_case As Boolean = True) As String
    Dim text_result, text_find As String
    Dim matches_index, pos_start As Integer
 
    On Error GoTo ErrHandle
    text_result = text
    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
 
    Set matches = regex.Execute(text)
 
    If 0 < matches.Count Then
        If (0 = instance_num) Then
            text_result = regex.Replace(text, text_replace)
        Else
            If instance_num <= matches.Count Then
                pos_start = 1
                For matches_index = 0 To instance_num - 2
                    pos_start = InStr(pos_start, text, matches.item(matches_index), vbBinaryCompare) + Len(matches.item(matches_index))
                Next matches_index
 
                text_find = matches.item(instance_num - 1)
                text_result = Left(text, pos_start - 1) & Replace(text, text_find, text_replace, pos_start, 1, vbBinaryCompare)
            End If
        End If
    End If
 
    RegExpReplace = text_result
    Exit Function
 
ErrHandle:
    RegExpReplace = CVErr(xlErrValue)
End Function

Добавьте этот код VBA в вашу рабочую книгу.

 Советы:

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

Синтаксис RegExpReplace

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

Функция принимает 5 аргументов, но обязательными являются только первые три.

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

Где:

  • Текст (обязательно) — текстовая строка для поиска.
  • Шаблон (обязательно) — регулярное выражение для сопоставления.
  • Text_replace (обязательно) — текст для замены найденных совпадающих подстрок.
  • Instance_num (необязательно) — порядковый номер, указывающий, какой из найденных экземпляров заменить. Если его не указать, функция заменит все найденные совпадения (по умолчанию).
  • Match_case (необязательный) — определяет, следует ли учитывать или же игнорировать регистр букв. Если значение ИСТИНА или опущено (по умолчанию), при поиске учитывается регистр; если ЛОЖЬ – то поиск совпадений происходит без учета регистра.

Функция работает во всех версиях Excel от 365 до 2010.

Полезные советы по использованию

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

  1. По умолчанию функция работает в режиме Заменить все. Чтобы заменить конкретное вхождение, поместите соответствующий номер в аргумент instance_num.
  2. По умолчанию функция чувствительна к регистру. Для поиска без учета регистра задайте для аргумента match_case значение ЛОЖЬ.
  3. Когда вы указываете регулярное выражение непосредственно в формуле, не забудьте заключить его в двойные кавычки (так как это текст).
  4. Если допустимый шаблон не найден, функция вернет исходное содержимое без изменений.
  5. Если регулярное выражение записано вами неверно, произойдет ошибка  #ЗНАЧ!.

Примеры регулярных выражений для поиска и замены в Excel

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

Замена строки, соответствующей шаблону

В приведенном ниже примере набора данных предположим, что вы хотите скрыть некоторые личные данные, такие как номер телефона. Учитывая, что это семизначное число в формате «000-00-00», для его нахождения мы используем следующее регулярное выражение.

Шаблон: d{3}-d{2}-d{4}

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

Текст замены : ХХХ-ХХ-ХХ

С исходной строкой в ​​A5 полная формула принимает следующий вид:

=RegExpReplace(A5; «d{3}-d{2}-d{2}»; «XXX-XX-XX»)

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

=RegExpReplace(A5; $A$2; $B$2)

Замена чисел в тексте

Чтобы найти любую цифру от 0 до 9, используйте d в своем регулярном выражении. Чтобы найти определенные цифры, используйте соответствующий квантификатор или создайте более сложное регулярное выражение, как показано в примерах ниже.

Заменить все числа

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

Шаблон : d+

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

=RegExpReplace(A5; «d+»; «*»)

Заменить суммы денег

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

Шаблон : ‘($d+.?d{0,2}b)|(₽d+.?d{0,2}b)|(d+.?d{0,2}₽)

Это регулярное выражение ищет и заменяет денежные величины вида $100, ₽100 и 100₽. Естественно, вы можете использовать и другие обозначения валюты платежа.

Вы ищете знак доллара или рубля, за которым следует одна или несколько цифр $d+ — эта часть соответствует единице доллара, ₽d+ означает соответственно рубли. После основной единицы может быть или не быть дробной единицы. Чтобы соответствовать ему, вы ищете ноль или один знак десятичного разряда (точку), после которого идут от 0 до 2 цифр .?d{0,2}. Граница слова b в конце гарантирует, что совпадающее значение не является частью большего числа.

Третья часть выражения ищет цифры, после которых могут быть (или не быть) два десятичных знака, и затем – знак рубля.

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

=RegExpReplace(A5; «‘($d+.?d{0,2}b)|(₽d+.?d{0,2}b)|(d+.?d{0,2}₽)»; «*»)

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

Поиск и замена всех совпадений

В классических регулярных выражениях есть глобальный флаг поиска /g, который заставляет регулярное выражение находить все возможные совпадения в строке. В VBA этот флаг не поддерживается. Вместо этого объект VBA RegExp предоставляет свойство Global, которое определяет, следует ли искать все вхождения или только первое. 

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

Итак, что вы делаете, чтобы заменить все вхождения, соответствующие шаблону? Ничего особенного. Это поведение реализовано по умолчанию. Вы в этом можете убедиться, еще раз внимательно взглянув на пример выше. В тексте заменены все подходящие комбинации символов, а не только первое вхождение.

Замена определенного по счёту экземпляра

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

Предположим, что вы хотите заменить только второй номер телефона, указанный у сотрудника. Поэтому в четвертом аргументе указываем 2.

=RegExpReplace(A5; $A$2; $B$2; 2)

Где $A$2 — шаблон регулярного выражения, а $B$2 — замещающий текст.

Как видно на скриншоте выше, второй телефон успешно заменён.

Поиск и замена в Excel с помощью Regex Tools

Вы слышали о недавнем дополнении к Ultimate Suite? Я имею в виду четыре мощных инструмента регулярных выражений , представленных в последней версии. По сравнению со своими аналогами VBA функции Ablebits Regex имеют два основных преимущества:

  • Вы можете использовать регулярные выражения в обычных книгах .xlsx без необходимости вставлять какой-либо код или включать макросы в Excel.
  • Обрабатываемые стандартным механизмом .NET RegEx, эти функции поддерживают полнофункциональные классические регулярные выражения и преодолевают многие ограничения VBA RegExp.

Функция AblebitsRegexReplace ищет совпадение с указанным регулярным выражением в ячейке и заменяет его указанными символами.

Синтаксис ее совершенно такой же, как у функции RegExpReplace, а вот возможности немного другие.

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

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

Как правило, чтобы найти символ, который используется как часть шаблона в регулярных выражениях, вам нужно поставить перед ним обратную косую черту. В регулярных выражениях действует как escape-символ, который отменяет «особое» назначение следующего символа и превращает его в обычный символ. Таким образом, чтобы найти квадратную скобку, вы ставите перед ней обратную косую черту: [ для соответствия открывающей скобке и ] для соответствия закрывающей скобке. Между скобками поместите группу символов для поиска. В зависимости от того, какой квантификатор вы используете в группе, будут производиться разные замены.

Жадный шаблон: [(.*)]

Этот шаблон выполняет жадный поиск — захватывает как можно больше знаков. В начале ищем открывающую скобку [. Выражение .* соответствует как можно большему числу символов. Итак, этот шаблон захватывает все от первой открывающей скобки до последней закрывающей скобки ].

Ленивый шаблон: [(.*?)]

Этот шаблон выполняет ленивый поиск — захватывает как можно меньше. Ищем открывающую скобку ]. Знак вопроса ? заставляет .* искать совпадение с как можно меньшим количеством символов, пока не найдется следующее совпадение в шаблоне, то есть закрывающая скобка ]. Таким образом, этот шаблон захватывает все, от первой открывающей скобки до первой закрывающей скобки.

Отрицание: [([^]]*)]

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

Как только вы определились с регулярным выражением, «скормите» его функции замены. Вот как:

  1. На вкладке Ablebits Data в группе Text щелкните Regex Tools .
  2. На панели Regex Tools настройте параметры
  3. Выберите исходные строки.
  4. Введите свой шаблон.
  5. Выберите параметр Replace with (Заменить на) и вставьте замещающий текст в поле.
  6. Чтобы результаты отображались в виде формул, а не значений, установите флажок Insert as a formula (Вставить как формулу) .
  7. Нажмите кнопку Replace (Заменить) .

Чтобы результаты отображались в виде формул, а не значений, установите флажок Insert as a formula (Вставить как формулу) .

Нажмите кнопку Replace (Заменить) .

После этого функция AblebitsRegexReplace вставляется в новый столбец справа от исходных данных.

=AblebitsRegexReplace(A2; «[(.*)]»; «*»)

Шаблон поиска и замещающий текст вы можете сохранить в отдельных ячейках и указывать соответствующие ссылки на них. В нашем случае мы вводим шаблоны в ячейки B2 и C2, вводим значение замены в A2, затем сравниваем результаты и выбираем желаемый результат:

Советы и примечания:

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

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

Разбор текста регулярными выражениямиОдной из самых трудоемких и неприятных задач при работе с текстом в Excel является парсинг — разбор буквенно-цифровой «каши» на составляющие и извлечение из нее нужных нам фрагментов. Например:

  • извлечение почтового индекса из адреса (хорошо, если индекс всегда в начале, а если нет?)
  • нахождение номера и даты счета из описания платежа в банковской выписке
  • извлечение ИНН из разношерстных описаний компаний в списке контрагентов
  • поиск номера автомобиля или артикула товара в описании и т.д.

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

  • Использовать встроенные текстовые функции Excel для поиска-нарезки-склейки текста: ЛЕВСИМВ (LEFT), ПРАВСИМВ (RIGHT), ПСТР (MID), СЦЕПИТЬ (CONCATENATE) и ее аналоги, ОБЪЕДИНИТЬ (JOINTEXT), СОВПАД (EXACT) и т.д. Этот способ хорош, если в тексте есть четкая логика (например, индекс всегда в начале адреса). В противном случае формулы существенно усложняются и, порой, дело доходит даже до формул массива, что сильно тормозит на больших таблицах.
  • Использование оператора проверки текстового подобия Like из Visual Basic, обернутого в пользовательскую макро-функцию. Это позволяет реализовать более гибкий поиск с использованием символов подстановки (*,#,? и т.д.) К сожалению, этот инструмент не умеет извлекать нужную подстроку из текста — только проверять, содержится ли она в нем.

Кроме вышеперечисленного, есть еще один подход, очень известный в узких кругах профессиональных программистов, веб-разработчиков и прочих технарей — это регулярные выражения (Regular Expressions = RegExp = «регэкспы» = «регулярки»). Упрощенно говоря, RegExp — это язык, где с помощью специальных символов и правил производится поиск нужных подстрок в тексте, их извлечение или замена на другой текст. Регулярные выражения — это очень мощный и красивый инструмент, на порядок превосходящий по возможностям все остальные способы работы с текстом. Многие языки программирования (C#, PHP, Perl, JavaScript…) и текстовые редакторы (Word, Notepad++…) поддерживают регулярные выражения.

Microsoft Excel, к сожалению, не имеет поддержки RegExp по-умолчанию «из коробки», но это легко исправить с помощью VBA. Откройте редактор Visual Basic с вкладки Разработчик (Developer) или сочетанием клавиш Alt+F11. Затем вставьте новый модуль через меню Insert — Module и скопируйте туда текст вот такой макрофункции:

Public Function RegExpExtract(Text As String, Pattern As String, Optional Item As Integer = 1) As String
    On Error GoTo ErrHandl
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = Pattern
    regex.Global = True
    If regex.Test(Text) Then
        Set matches = regex.Execute(Text)
        RegExpExtract = matches.Item(Item - 1)
        Exit Function
    End If
ErrHandl:
    RegExpExtract = CVErr(xlErrValue)
End Function

Теперь можно закрыть редактор Visual Basic и, вернувшись в Excel, опробовать нашу новую функцию. Синтаксис у нее следующий:

=RegExpExtract( Txt ; Pattern ; Item )

где

  • Txt — ячейка с текстом, который мы проверяем и из которого хотим извлечь нужную нам подстроку
  • Pattern — маска (шаблон) для поиска подстроки
  • Item — порядковый номер подстроки, которую надо извлечь, если их несколько (если не указан, то выводится первое вхождение)

Самое интересное тут, конечно, это Pattern — строка-шаблон из спецсимволов «на языке» RegExp, которая и задает, что именно и где мы хотим найти. Вот самые основные из них — для начала:

 Паттерн  Описание
 . Самое простое — это точка. Она обозначает любой символ в шаблоне на указанной позиции.
 s Любой символ, выглядящий как пробел (пробел, табуляция или перенос строки).
 S Анти-вариант предыдущего шаблона, т.е. любой НЕпробельный символ.
 d Любая цифра
 D Анти-вариант предыдущего, т.е. любая НЕ цифра
 w Любой символ латиницы (A-Z), цифра или знак подчеркивания
 W Анти-вариант предыдущего, т.е. не латиница, не цифра и не подчеркивание.
[символы] В квадратных скобках можно указать один или несколько символов, разрешенных на указанной позиции в тексте. Например ст[уо]л будет соответствовать любому из слов: стол или стул.
Также можно не перечислять символы, а задать их диапазоном через дефис, т.е. вместо [ABDCDEF] написать [A-F]. или вместо [4567] ввести [4-7]. Например, для обозначения всех символов кириллицы можно использовать шаблон [а-яА-ЯёЁ].
[^символы] Если после открывающей квадратной скобки добавить символ «крышки» ^, то набор приобретет обратный смысл — на указанной позиции в тексте будут разрешены все символы, кроме перечисленных. Так, шаблон [^ЖМ]уть найдет Путь или Суть или Забудь, но не Жуть или Муть, например.
 | Логический оператор ИЛИ (OR) для проверки по любому из указанных критериев. Например чет|счёт|invoice) будет искать в тексте любое из указанных слов. Обычно набор вариантов заключается в скобки.
 ^ Начало строки
 $ Конец строки
 b Край слова

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

  Квантор  Описание
 ? Ноль или одно вхождение. Например .? будет означать один любой символ или его отсутствие.
 + Одно или более вхождений. Например d+ означает любое количество цифр (т.е. любое число от 0 до бесконечности).
 * Ноль или более вхождений, т.е. любое количество. Так s* означает любое количество пробелов или их отсутствие.
{число} или
{число1,число2}
Если нужно задать строго определенное количество вхождений, то оно задается в фигурных скобках. Например d{6} означает строго шесть цифр, а шаблон s{2,5} — от двух до пяти пробелов

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

Извлекаем числа из текста

Для начала разберем простой случай — нужно извлечь из буквенно-цифровой каши первое число, например мощность источников бесперебойного питания из прайс-листа:

Извлекаем первое число из текста

Логика работы регулярного выражения тут простая: d — означает любую цифру, а квантор + говорит о том, что их количество должно быть одна или больше. Двойной минус перед функцией нужен, чтобы «на лету» преобразовать извлеченные символы в полноценное число из числа-как-текст.

Почтовый индекс

На первый взгляд, тут все просто — ищем ровно шесть цифр подряд. Используем спецсимвол d для цифры и квантор {6} для количества знаков:

Извлекаем почтовый индекс

Однако, возможна ситуация, когда левее индекса в строке стоит еще один большой набор цифр подряд (номер телефона, ИНН, банковский счет и т.д.) Тогда наша регулярка выдернет из нее первых 6 цифр, т.е. сработает некорректно:

Ошибочное извлечение индекса

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

Извлекаем ровно 6-разрядное число

Телефон

Проблема с нахождением телефонного номера среди текста состоит в том, что существует очень много вариантов записи номеров — с дефисами и без, через пробелы, с кодом региона в скобках или без и т.д. Поэтому, на мой взгляд, проще сначала вычистить из исходного текста все эти символы с помощью нескольких вложенных друг в друга функций ПОДСТАВИТЬ (SUBSTITUTE), чтобы он склеился в единое целое, а потом уже примитивной регуляркой d{11} вытаскивать 11 цифр подряд:

Вытаскиваем номер телефона из текста

ИНН

Тут чуть сложнее, т.к. ИНН (в России) бывает 10-значный (у юрлиц) или 12-значный (у физлиц). Если не придираться особо, то вполне можно удовлетвориться регуляркой d{10,12}, но она, строго говоря, будет вытаскивать все числа от 10 до 12 знаков, т.е. и ошибочно введенные 11-значные. Правильнее будет использовать два шаблона, связанных логическим ИЛИ оператором | (вертикальная черта):

Извлечение ИНН из текстовой строки

Обратите внимание, что в запросе мы сначала ищем 12-разрядные, и только потом 10-разрядные числа. Если же записать нашу регулярку наоборот, то она будет вытаскивать для всех, даже длинных 12-разрядных ИНН, только первые 10 символов. То есть после срабатывания первого условия дальнейшая проверка уже не производится:

Некорректное извлечение ИНН

Это принципиальное отличие оператора | от стандартной экселевской логической функции ИЛИ (OR), где от перестановки аргументов результат не меняется.

Артикулы товаров

Во многих компаниях товарам и услугам присваиваются уникальные идентификаторы — артикулы, SAP-коды, SKU и т.д. Если в их обозначениях есть логика, то их можно легко вытаскивать из любого текста с помощью регулярных выражений. Например, если мы знаем, что наши артикулы всегда состоят из трех заглавных английских букв, дефиса и последующего трехразрядного числа, то:

Артикулы

Логика работы шаблона тут проста. [A-Z] — означает любые заглавные буквы латиницы. Следующий за ним квантор {3} говорит о том, что нам важно, чтобы таких букв было именно три. После дефиса мы ждем три цифровых разряда, поэтому добавляем на конце d{3}

Денежные суммы

Похожим на предыдущий пункт образом, можно вытаскивать и цены (стоимости, НДС…) из описания товаров. Если денежные суммы, например, указываются через дефис, то:

Извлечь стоимость (цену) из текста

Паттерн d с квантором + ищет любое число до дефиса, а d{2} будет искать копейки (два разряда) после.

Если нужно вытащить не цены, а НДС, то можно воспользоваться третьим необязательным аргументом нашей функции RegExpExtract, задающим порядковый номер извлекаемого элемента. И, само-собой, можно заменить функцией ПОДСТАВИТЬ (SUBSTITUTE) в результатах дефис на стандартный десятичный разделитель и добавить двойной минус в начале, чтобы Excel интерпретировал найденный НДС как нормальное число:

Извлекаем суммы и НДС из текста

Автомобильные номера

Если не брать спецтранспорт, прицепы и прочие мотоциклы, то стандартный российский автомобильный номер разбирается по принципу «буква — три цифры — две буквы — код региона». Причем код региона может быть 2- или 3-значным, а в качестве букв применяются только те, что похожи внешне на латиницу. Таким образом, для извлечения номеров из текста нам поможет следующая регулярка:

Извлекаем автомобильный номер из текста

Время

Для извлечения времени в формате ЧЧ:ММ подойдет такое регулярное выражение:

Извлекаем время из текста

После двоеточия фрагмент [0-5]d, как легко сообразить, задает любое число в интервале 00-59. Перед двоеточием в скобках работают два шаблона, разделенных логическим ИЛИ (вертикальной чертой):

  • [0-1]d — любое число в интервале 00-19
  • 2[0-3] — любое число в интервале 20-23

К полученному результату можно применить дополнительно еще и стандартную Excel’евскую функцию ВРЕМЯ (TIME), чтобы преобразовать его в понятный программе и пригодный для дальнейших расчетов формат времени.

Проверка пароля

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

Проверку можно организовать с помощью вот такой несложной регулярки:

Проверка пароля регулярным выражением

По сути, таким шаблоном мы требуем, чтобы между началом (^) и концом ($) в нашем тексте находились только символы из заданного в квадратных скобках набора. Если нужно проверить еще и длину пароля (например, не меньше 6 символов), то квантор + можно заменить на интервал «шесть и более» в виде {6,}:

Проверка длины пароля

Город из адреса

Допустим, нам нужно вытащить город из строки адреса. Поможет регулярка, извлекающая текст от «г.» до следующей запятой:

Извлечь город из адреса

Давайте разберем этот шаблон поподробнее.

Если вы прочитали текст выше, то уже поняли, что некоторые символы в регулярных выражениях (точки, звездочки, знаки доллара и т.д.) несут особый смысл. Если же нужно искать сами эти символы, то перед ними ставится обратная косая черта (иногда это называют экранированием). Поэтому при поиске фрагмента «г.» мы должны написать в регулярке г. если ищем плюсик, то + и т.д.

Следующих два символа в нашем шаблоне — точка и звездочка-квантор — обозначают любое количество любых символов, т.е. любое название города.

На конце шаблона стоит запятая, т.к. мы ищем текст от «г.» до запятой. Но ведь в тексте может быть несколько запятых, правда? Не только после города, но и после улицы, дома и т.д. На какой из них будет останавливаться наш запрос? Вот за это отвечает вопросительный знак. Без него наша регулярка вытаскивала бы максимально длинную строку из всех возможных:

Извлекаем город из адреса - жадный квантор

В терминах регулярных выражений, такой шаблон является «жадным». Чтобы исправить ситуацию и нужен вопросительный знак — он делает квантор, после которого стоит, «скупым» — и наш запрос берет текст только до первой встречной запятой после «г.»:

Скупой квантор

Имя файла из полного пути

Еще одна весьма распространенная ситуация — вытащить имя файла из полного пути. Тут поможет простая регулярка вида:

Извлечь имя файла из полного пути

Тут фишка в том, что поиск, по сути, происходит в обратном направлении — от конца к началу, т.к. в конце нашего шаблона стоит $, и мы ищем все, что перед ним до первого справа обратного слэша. Бэкслэш заэкранирован, как и точка в предыдущем примере.

P.S.

«Под занавес» хочу уточнить, что все вышеописанное — это малая часть из всех возможностей, которые предоставляют регулярные выражения. Спецсимволов и правил их использования очень много и на эту тему написаны целые книги (рекомендую для начала хотя бы эту). В некотором смысле, написание регулярных выражений — это почти искусство. Почти всегда придуманную регулярку можно улучшить или дополнить, сделав ее более изящной или способным работать с более широким диапазоном вариантов входных данных.

Для анализа и разбора чужих регулярок или отладки своих собственных есть несколько удобных онлайн-сервисов: RegEx101, RegExr и др.

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

Если же вы не новичок в теме, и вам есть чем поделиться — оставляйте полезные при работе в Excel регулярки в комментариях ниже. Один ум хорошо, а два сапога — пара!

Ссылки по теме

  • Замена и зачистка текста функцией ПОДСТАВИТЬ (SUBSTITUTE)
  • Поиск и подсветка символов латиницы в русском тексте
  • Поиск ближайшего похожего текста (Иванов = Ивонов = Иваноф и т.д.)

  • Функции регулярных выражений в Excel
  • Примеры задач, решаемых с помощью регулярных выражений
  • Извлечение данных из ячеек с помощью RegEx
    • Извлечь из ячейки содержимое до / после первой цифры включительно
    • «Вытянуть» цифры из ячеек
    • Извлечь из ячейки числа из N цифр
    • Извлечь латиницу регулярным выражением
    • Извлечь символы в конце/начале строк по условию
  • Проверить ячейки на соответствие регулярному выражению
    • Найти в ячейке числа из N цифр
    • Найти ячейки, начинающиеся с цифр
  • Замена подстрок по регулярному выражению
    • Разбить ячейку по буквам
    • Разбить буквы и цифры в ячейке
    • Вставить текст после первого слова
    • Вставить символ после каждого слова или перед ним
  • Регулярные выражения для поиска конкретных слов в !SEMTools
    • Найти слова по регулярному выражению
    • Извлечь слова по регулярному выражению
  • Удалить слова по регулярному выражению
  • Очистить ячейки, не соответствующие регулярному выражению

Многие слышали, что такое регулярные выражения, но не всем известно, что они поддерживаются “под капотом” Microsoft Excel. Регулярные выражения дают возможность многократно ускорить работу с текстом, находить в нем самые замысловатые паттерны и решать самые сложные исследовательские задачи. Единственная проблема в том, что для их использования в Excel необходимо знание VBA.

Почему Microsoft не включила их как функции листа и включит ли когда-нибудь, непонятно и неизвестно.

Но с надстройкой !SEMTools эти знания не нужны. Зато минимальное понимание синтаксиса регулярок позволит с легкостью решать задачи, решение которых практически невозможно с помощью стандартных функций, либо для этого требуются формулы огромной длины. Примеры таких мегаформул можно посмотреть в решении задач:

  • найти английские буквы в Excel,
  • найти числа в тексте.

Для поддержки регулярных выражений при наличии подключенной надстройки !SEMTools в Excel будут работать три функции: REGEXMATCH, REGEXEXTRACT и REGEXREPLACE.

Их синтаксис и принцип работы аналогичен синтаксису Google Spreadsheets. Поэтому формулы, составленные в Excel, будут иметь полную зеркальную совместимость с Google Spreadsheets.

=REGEXMATCH("текст";"RegEx-паттерн для поиска")

REGEXMATCH возвращает ИСТИНА или ЛОЖЬ (TRUE или FALSE в английской версии Excel), в зависимости от того, соответствует текст паттерну или нет.

=REGEXEXTRACT("текст";"RegEx-паттерн для поиска")

REGEXEXTRACT извлекает первый попадающий под паттерн фрагмент текста. Небольшое отличие от Google Spreadsheets заключается в том, что, если в искомом тексте такого фрагмента нет, Spreadsheets отдают ошибку, а в надстройке отдается пустая строка.

=REGEXREPLACE("текст";"RegEx-паттерн для поиска";"текст, которым заменяем найденное")

Примеры задач, решаемых с помощью регулярных выражений

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

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

Извлечение данных из ячеек с помощью RegEx

Извлечь из ячейки содержимое до / после первой цифры включительно

Такие простые два выражения. «+» — это служебный символ-квантификатор. Он обеспечивает «жадный» режим, при котором берутся все удовлетворяющие выражению символы до тех пор, пока на пути не встретится не удовлетворяющий ему или наступит конец/начало строки. Точка обозначает любой символ. Таким образом, берутся любые символы до конца строки, перед которыми есть цифра.

«d» обозначает «digits», иначе цифры. Поскольку квантификатора после “d” в примерах выше нет, то одну цифру. Если потребуется исключить из результатов эту цифру, это можно сделать позднее. В !SEMTools есть простые способы удалить символы в начале или конце ячейки.

Цифры можно выразить и другим регулярным выражением:

«Вытянуть» цифры из ячеек

Как извлечь из строки цифры? Регулярное выражение для такой операции будет безумно простым:

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

Если их нужно вывести не сплошной последовательностью, а через разделитель, сохранив фрагменты, где символы следуют друг за другом, выражение будет чуть иным, с «жадным» квантификатором. А при извлечении нужно будет использовать разделитель.

Это справедливо и для любых других символов, пример с числами ниже:

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

Извлечь из ячейки числа из N цифр

Как видно в примере выше, помимо чисел, обозначающих годы, были извлечены и другие числа, например, «1». Чтобы извлечь исключительно последовательности из четырех цифр, потребуется видоизменить выражение. Есть несколько вариантов:

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

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

Извлекаем все 4-цифровые последовательности (год) через разделитель

Извлечь латиницу регулярным выражением

Выражение [a-zA-Z] обозначает все символы латиницы. Дефис и в этом, и в предыдущем случае обозначает, что берутся все символы между a и z и между A и Z в общей таблице символов Unicode. Квадратные скобки — синоним “ИЛИ”. Рассматривается каждый из элементов или множеств внутри квадратных скобок, при этом выражение не находит ничего, только если сравниваемая строка не содержит ни одного элемента внутри квадратных скобок.

извлечь латиницу регулярным выражением

Извлекаем латиницу с помощью регулярных выражений

Извлечь символы в конце/начале строк по условию

Стандартные формулы ПРАВСИМВ и ЛЕВСИМВ позволяют извлечь из ячейки соответственно последние и первые N символов, но на этом их возможности заканчиваются.

С помощью же регулярных выражений можно извлечь:

  • Символы, идущие после и включая последнюю заглавную букву в ячейке, заканчивающейся на восклицательный знак. Так мы извлечем из ячеек все восклицательные предложения. Выражение для этого выглядит так: [А-Я][а-яa-z0-9 ]+!$.
  • Первые N выбранных символов из определенного множества, если ячейка с них начинается.
  • Аналогично: последние N определенных символов, если ячейка на них заканчивается.

Проверить ячейки на соответствие регулярному выражению

Если нет необходимости извлекать данные, а нужно лишь проверить, соответствуют ли они паттерну, чтобы потом отфильтровать их, удобнее использовать процедуру, эквивалентную формуле REGEXMATCH.

Найти в ячейке числа из N цифр

В зависимости от того, является N необходимым или достаточным условием, нужны разные регулярные выражения. Иными словами, считать ли последовательности из N+1, N+2 и т.д. цифр подходящими или нет. Если да, выражение будет таким же, как уже указывалось выше:

dddd
[0-9][0-9][0-9][0-9]
d{4}
[0-9]{4}

Если же нас интересуют строго последовательности из N цифр, задачу придется производить в две итерации:

  • В первую итерацию извлекать цифры вместе с границами строк или нецифровыми символами, идущими после/перед (это станет своеобразной проверкой отсутствия других цифр).
  • И во вторую уже сами цифры.

Выражения для первой итерации будут, соответственно:

(^|D)dddd($|D)
(^|D)[0-9][0-9][0-9][0-9]($|D)
(^|D)d{4}($|D)
(^|D)[0-9]{4}($|D)

Если внимательно посмотреть на отличие в синтаксисе, можно понять, что означают символы в нем:

  • вертикальная черта “|” обозначает “ИЛИ”,
  • скобки “( )” нужны для перечисления внутри них аргументов и “отгораживания” их от остального выражения,
  • каретка “^” обозначает начало строки,
  • символ доллара “$” — конец строки,
  • D — нечисловые символы. Обратите внимание: верхний регистр меняет значение d на противоположное. Это справедливо также для пар w и W, обозначающих латиницу и цифры и не-латиницу и цифры, и s и S, различные виды пробелов и не-пробельные символы соответственно.

Найти ячейки, начинающиеся с цифр

Выражение для подобной проверки будет:

Либо можно воспользоваться процедурой проверки на копии исходного диапазона без необходимости вводить формулу. Смотрите примеры.

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

Замена подстрок по регулярному выражению

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

  • удаление цифр из текста,
  • удаление пунктуации,
  • всех символов, кроме букв и цифр.

Но бывают случаи, когда необходима реальная замена, например, когда нужно заменить буквы с “хвостиками”/умляутами/ударениями и прочими символами из европейских алфавитов на их английские аналоги. Задача популярна среди SEO-специалистов, формирующих урлы сайтов этих стран на основе оригинальной семантики. Так выглядит начало таблицы паттернов для замены диакритических символов на латиницу с помощью RegEx при генерации URL:

Диакритические символы и их английские эквиваленты

Разбить ячейку по буквам

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

разбить текст на символы через разделитель

Разбить буквы и цифры в ячейке

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

А так будет выглядеть процесс на практике:

Разбить текст на цифровые и нецифровые символы

Разбиваем текст на цифры и нецифровые символы (буквы и знаки препинания) с помощью регулярного выражения

Вставить текст после первого слова

При замене по регулярному выражению в !SEMTools есть опция замены не всех, а только первого найденного фрагмента, удовлетворяющего паттерну. Это позволяет решить задачу вставки символов после первого слова. Просто заменим первый пробел на нужные нам символы с помощью соответствующей процедуры (эту задачу можно решить также с помощью функции ПОДСТАВИТЬ, но можно и воспользоваться функционалом замены по регулярному выражению). В отличие от обычной процедуры замены, здесь можно заменить только первое вхождение. В данном случае — первый пробел. Как видно, пробел ничем не отличается от обычного:

Заменяем первый пробел с помощью замены по регулярному выражению

Вставить символ после каждого слова или перед ним

Надстройка решает эту задачу в два клика готовой процедурой в меню “Изменить слова“, но можно воспользоваться и несложным выражением для замены:

Выражения обозначают, что заменяются пробелы или конец строки в первом случае и пробелы или начало строк во втором. Вертикальная черта — то самое “ИЛИ”.

А заменять будем, соответственно, на пробел с символом слева или справа. Процедура добавит лишний пробел перед ячейкой или после, поэтому от него желательно будет избавиться — удалить лишние пробелы или удалить символы в начале / конце ячейки.

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

Регулярные выражения для поиска конкретных слов в !SEMTools

Найти слова по регулярному выражению

Извлечь слова по регулярному выражению

Когда дело доходит до извлечения определенных слов, регулярные выражения становятся невероятно сложными. Поэтому надстройка !SEMTools упрощает задачу до применения паттернов RegEx на уровне слов как отдельных сущностей.

Вот так выглядит извлечение слов, содержащих латиницу и цифры, из массива слов, с помощью регулярного выражения:

Обратите внимание, что выражение означает, что цифра за буквой или буква за цифрой должны следовать непосредственно, без промежуточных символов между ними. Если нужно извлечь в том числе слова вида “asdf-13”, “1234-d”, понадобится обозначить возможность наличия символов между:

Удалить слова по регулярному выражению

Очистить ячейки, не соответствующие регулярному выражению

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

Примеры:

  • оставить ячейки с определенным количеством слов,
  • оставить ячейки с определенным количеством символов,
  • оставить ячейки, содержащие только цифры,
  • оставить ячейки, содержащие только буквы,
  • оставить ячейки, содержащие адрес электронной почты в доменной зоне .com и .ru.

Примеры использования “Извлечь ячейки по регулярному выражению”.

You can use text functions to manipulate text strings in Excel. However, you can’t use them with regular expressions. As of writing this article VBA is your only option. In this guide, we’re going to show you how to use regular expressions in Excel.

Download Workbook

What is a regular expression?

A regular expression (also known as regex or regexp shortly) is a special text string for specifying a search pattern. They are like wildcards. Instead of specifying the number of characters, you can create patterns to find a specific group of characters, like searching between «b» to «o», using OR logic, excluding some characters, or repeating values.

Regular expressions are commonly used for text parsing and replacing operations for all programming languages. To use regular expressions in Excel, we will be using VBA.

Pattern Description Samples
^jack begins with «jack» jack-of-all-trades, jack’s house
jack$ ends with «jack» hijack
^jack$ is exactly «jack» jack
colo[u]{0,}r can include «u» at least 0 times colour, color (not colur)
col[o|u]r includes either «o» or «u» color, colur (not colour)
col[^u]r accepts any character except «u» color (not colur or colour)

How to use regular expressions

Let’s start using regular expressions in Excel by opening VBA. Press Alt + F11 keys to open VBA (Visual Basic for Applications) window. Add a module to enter your code.

Next step is to add regular expression reference to VBA. Click Tools > References in the VBA toolbar. Find and check Microsoft VBScript Regular Expressions 5.5 item in the References window. Click OK to add the reference.

How to use regular expressions in Excel 02

Using the VBScript reference, we can create a regular expression object, which is defined as RegExp in VBA. A RegExp object has 4 properties and 3 methods:

Properties

Name Type Description
Global Boolean Set True to find all cases that match with the pattern.
Set False to find the first match.
IgnoreCase Boolean Set True to not make case-sensitive search.
Set False to make case-sensitive search.
Multiline Boolean Set True if your string has multiple lines and you want to perform the search in all lines.
Pattern String The regular expression pattern you want to search.

Methods

Name Arguments Description
Execute sourceString As String Returns an array that contains all occurrences of the pattern matched in the string.
Replace sourceString As String replaceVar As Variant Returns a string which all occurrences of the pattern in the string are replaced with the replaceVar string.
Test sourceString As String Returns True if there is a match. Otherwise, False.

Code Samples

A function that returns TRUE/FALSE if the pattern is found in a string

Public Function RegExFind(str As String, pat As String) As Boolean

‘Define the regular expression object

Dim RegEx As New RegExp

‘Set up regular expression properties

With RegEx

.Global = False ‘All occurences are not necessary since a single occurence is enough

.IgnoreCase = True ‘No case-sensitivty

.MultiLine = True ‘Check all lines

.Pattern = pat ‘pattern

End With

RegExFind = RegEx.Test(str)

End Function

How to use regular expressions in Excel 04

After writing the code, you can use this function as a regular Excel function.

A function that replaces the pattern with a given string

Public Function RegExReplace(str As String, pat As String, replaceStr As String) As String

‘Define the regular expression object

Dim RegEx As New RegExp

‘Set up regular expression properties

With RegEx

.Global = False ‘All occurences are not necessary since a single occurence is enough

.IgnoreCase = True ‘No case-sensitivty

.MultiLine = True ‘Check all lines

.Pattern = pat ‘pattern

End With

RegExReplace = RegEx.Replace(str, replaceStr) ‘Return the modified string with replacement value

End Function

How to use regular expressions in Excel 06

The following sample shows how to replace strings that start with «col», continue with 0 or 1 occurrences of «o» and single «u», and finally ends with an «r» character with «Color» string.

Содержание

  1. Обработка текста в Excel. Регулярные выражения.
  2. 09.07.2019 Багдасарян Дмитрий
  3. Excel Regex to find and replace strings using regular expressions
  4. Excel VBA Regex Replace function
  5. RegExpReplace syntax
  6. Usage notes
  7. Excel Regex replace examples
  8. Regex to replace string matching a pattern
  9. Regex to replace number in a string
  10. Replace all numbers
  11. Replace amounts of money
  12. Regex to find and replace all matches
  13. Regex to replace a specific instance
  14. Search and replace in Excel with Regex Tools
  15. How to replace strings using regular expressions

Обработка текста в Excel. Регулярные выражения.

09.07.2019 Багдасарян Дмитрий

Время прочтения: 7 мин.

Зачастую, при работе с многочисленными выгрузками в MS Excel нам приходится обрабатывать, фильтровать и буквально «вытаскивать» интересующие нас и так необходимые в повседневной работе данные. Степень трудоемкости таких «вытаскиваний» варьируется от «выбрать все желтые и красные строчки, потому что остальные – это не наши» до «посчитать для всех клиентов с ФИО Иванов Иван Иванович, у которых в день было больше трех операций и которые обслуживались в ВСП на территории ГОСБ, сумму их вкладных операций». В соответствии с поставленной перед нами задачей, мы выбираем инструмент для ее решения.

Но что делать, если стандартными средствами MS Excel поставленную задачу не решить. Одним из наиболее подходящих инструментов в данной ситуации является применение «регулярных выражений» (regular expressions). Проще говоря, регулярные выражения — это язык, где с помощью специальных символов и правил производится поиск нужных подстрок в тексте, их извлечение или замена на другой текст. Но, к сожалению, MS Excel, не имеет поддержки данного инструмента по умолчанию, тем не менее, это легко исправить вручную, проделав ряд следующих операций (нижеследующая настройка производится для MS Excel 2016, для MS Excel 2010 процедура аналогична):

  1. Необходимо убедиться в том, что в MS Excel включена вкладка «Разработчик» и не запрещено применение макросов:

Если вкладка отсутствует, ее необходимо активировать следующим образом:

а) С помощью перехода в меню «Файл»-> «Параметры», отрываем окно «Параметры Excel»:

б) На вкладке «Настроить ленту» нужно выбрать «Все вкладки» и поставить отметку в строке «Разработчик», после чего нажать «ОК»:

в) Также, во вкладке «Центр управления безопасностью», необходимо перейти в «Параметры центра управления безопасностью»:

г) В открывшемся окне нужно проверить, включены ли макросы, и нажать «ОК»:

2. Перейти в «Microsoft Visual Basic for Applications», нажав кнопку «Visual Basic» во вкладке «Разработчик» или же с помощью сочетания клавиш Alt+F11

3. В открывшемся окне, необходимо последовательно перейти в меню «Инструменты» («Tools») -> «Ссылки» («References»):

4. В окне «Ссылки» («References») нужно проставить отметку в строке Microsoft VBScript Regular Expressions 5.5, после чего нажать «ОК»:

5. В окне «Microsoft Visual Basic for Applications» создать новый модуль с помощью команд «Вставка» («Insert») -> «Модуль» («Module»):

6. В открывшемся редакторе кода, необходимо написать следующую функцию:

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

Результатом же будет искомая подпоследовательность, либо сообщение об ошибке в случае отсутствия таковой.

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

Наконец, процесс подготовки завершен, и мы можем потренироваться в написании регулярных выражений. Но, предварительно, давайте разберемся, как выглядят шаблоны для поиска. Вот самые основные из них:

Метасимвол Описание
. Точка — обозначает любой символ в шаблоне на указанной позиции (кроме знака новой строки n).
s Любой знак пробела, а именно: пробел, табуляция и перенос строки.
S Противоположный по смыслу вариант предыдущего шаблона, то есть любой символ, не выглядящий как пробел.
d Цифровой символ, то есть любая цифра.
D Нецифровой символ — любой символ кроме цифры.
w Любой символ латиницы (a-z, A-Z), цифра (0-9) или знак подчеркивания (_).
W Анти-вариант предыдущего, то есть не латиница, не цифра и не подчеркивание.
[символы] В квадратных скобках можно указать один или несколько символов, разрешенных на указанной позиции в тексте. Например, тр[ае]к будет соответствовать любому из слов: трак или трек. Также можно не перечислять символы, а задать их диапазоном через дефис, таким образом, вместо [АБВГД] можно написать [А-Д], или вместо [12345] ввести [1-5]. Например, для обозначения всех символов кириллицы можно использовать шаблон [а-яА-ЯёЁ].
[^символы] Символ ^ придает набору символов в квадратных скобках обратный смысл — на указанной позиции в тексте будут разрешены все символы, кроме перечисленных. Так, шаблон [^дп]уть найдет суть или муть, но не дуть или путь, например.
| Логический оператор ИЛИ для проверки по любому из альтернативных критериев. Например, (ТБ|ГОСБ|ВСП) будет искать в тексте любое из указанных слов. Обычно набор вариантов заключается в скобки.
^ Позиция начала строки
$ Позиция конца строки
b Граница слова, то есть позиция между словом и пробелом
B Позиция, отличная от границы слова

Если мы ищем определенное количество символов, например, пятизначные номера ВСП или двадцатизначные номера счетов, то на помощь нам приходят квантификаторы — специальные выражения, задающие количество вхождений искомых знаков. Квантификатор применяется к предыдущему символу:

Квантификатор Описание
? Ноль или одно вхождение. Например, d? будет означать одна любая цифра или ее отсутствие.
+ Одно или более вхождений. К примеру, s+ означает один или более пробелов.
* Ноль или более вхождений. Так [AZ]* — как отсутствие, так и наличие любого количества прописных символов латиницы.
<число> или
<число1,число2>
Этот квантификатор задает строго определенное вхождение символа. Например, d означает строго десять цифр, а d — от трех до пяти цифр.

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

К примеру, рассмотрим задачу поиска в строке ИНН:*

Как видим, теперь и 10-значные, и 12-значные ИНН извлекаются корректно. Рассмотрим шаблон более подробно: b(d<10>|d<12>)b. В начале и в конце шаблона мы видим добавившиеся символы b – они означают края слова и применяются для того, чтобы вместо ИНН из текста не тянулась часть более длинного ОГРН или еще какой-либо последовательности цифр. Также, мы видим, что уже знакомый нам шаблон d <10>переместился в скобки и получил альтернативный шаблон d <12>– это сделано для того, чтобы наряду с 10-значными ИНН, производился поиск и 12-значных.

Рассмотрим следующий пример: имеется перечень клиентских операций, где каждая операция содержит ФИО клиента, которые нам требуется извлечь. Относительно ФИО строго выполняется лишь одно условие — они всегда набраны в верхнем регистре. Стандартные функции Excel также не справятся:

В данном случае мы применяем шаблон вида [А-ЯЁ]+s[А-ЯЁ]+s[А-ЯЁ]+, который состоит из трех шаблонов [А-ЯЁ]+, соединенных между собой символами s. Здесь все просто – [А-ЯЁ]+ это любой заглавный символ кириллицы с квантификатором +, то есть встречающийся от одного раза до бесконечности. Это, как раз, и будет либо фамилией, либо именем, либо отчеством клиента. Соединительные символы s означают пробелы между членами ФИО.

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

Источник

Excel Regex to find and replace strings using regular expressions

by Svetlana Cheusheva, updated on March 10, 2023

The Regex Replace function is missing in your Excel? This tutorial shows how to quickly add it to your workbooks, so you could use regular expressions to replace text strings in Excel.

When it comes to changing one piece of text to another, Microsoft Excel provides a number of options to choose from including the Find and Replace tool and a couple of substitution functions. Why would one want to complicate things with regexes? Because Excel’s standard features can only process an exact string that you specify. To find a string that matches some pattern and replace it with something else, regular expressions are indispensable.

Excel VBA Regex Replace function

As it’s generally known, built-in Excel functions do not support regular expressions. To be able to use regexes in your formulas, you need to create your own function. Luckily, the RegExp object already exists in VBA, and we are using this object in the below code:

  • If you have little experience with VBA, this guide will walk you through the process: How to insert VBA code in Excel.
  • After adding the code, remember to save your file as a macro-enabled workbook (.xlsm).

RegExpReplace syntax

The RegExpReplace function searches an input string for values that match a regular expression and replaces the found matches with the text you specify.

The function accepts 5 arguments, but only the first three are required.

  • Text (required) — the text string to search in.
  • Pattern (required) — the regular expression to match.
  • Text_replace (required) — the text to replace the matching substrings with.
  • Instance_num (optional) — a serial number indicating which instance to replace. If omitted, the function will replace all found matches (default).
  • Match_case (optional) — controls whether to match or ignore text case. If TRUE or omitted (default), the search is case-sensitive; if FALSE — case-insensitive.

The function works in all versions of Excel 365, Excel 2021, Excel 2019, Excel 2016, Excel 2013 and Excel 2010.

Usage notes

To ensure that your results will meet your expectations, let’s take a closer look at the inner mechanics:

  1. By default, the function works in the Replace all mode. To substitute a specific occurrence, put a corresponding number in the instance_num argument.
  2. By default, the function is case-sensitive. For case-insensitive search, set the match_case argument to FALSE. Because of the VBA RegExp limitations, the classic case-insensitive pattern (?i) is not supported.
  3. When you supply a regex directly in a formula, remember to enclose it in double quotation marks.
  4. If a valid pattern is not found, the function will return the original string with no changes.
  5. If the regex is invalid, a #VALUE! error will occur.

Excel Regex replace examples

Assuming you’ve already inserted the RegExpReplace function in your workbook, let’s get to more fascinating things — using regular expressions for advanced find and replace in Excel.

Regex to replace string matching a pattern

In the sample dataset below, supposing you want to hide some personal data such as social security numbers. Given that SSN is a nine-digit number in the format «000-00-0000», we are using the following regular expression to find it.

For replacement, this string is used:

Replacement text: XXX-XX-XXXX

With the original string in A5, the complete formula takes this form:

For convenience, you can enter the pattern and replacement text in separate cells and refer to those cells in your formula. If you plan to use the formula for multiple cells, remember to lock the cell addresses with the $ sign:

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

Regex to replace number in a string

To find any single digit from 0 to 9, use d in your regular expression. To find specific digits, use an appropriate quantifier or construct a more sophisticated regex like shown in the below examples.

Replace all numbers

To replace absolutely all numbers in a string with some character or text, use the + quantifier, which says to search for numbers containing 1 or more digits.

For example, to replace all numbers in cell A5 with an asterisk, use this formula:

=RegExpReplace(A5, «d+», «*»)

Replace amounts of money

In the same dataset, suppose you wish to replace only the amounts of money and not all the numbers. To have it done, you search for the dollar sign followed by one or more digits $d+ — this part matches the dollar unit. After the main unit, there may or may not be a fractional unit. To match it, you look for zero or one period after which come from 0 to 2 digits .?d<0,2>. The word boundary b in the end ensures that the matching value is not part of a bigger number.

Serve this regular expression to our custom function and you’ll get the follwoing result:

=RegExpReplace(A5, «$d+.?d<0,2>b», «*»)

Regex to find and replace all matches

In classic regular expressions, there is the global search flag /g that forces a regex to find all possible matches in a string. In VBA, this flag is not supported. Instead, the VBA RegExp object provides the Global property that defines whether to search for all occurrences or only the first one. In the code of our function, the Global property is set to True, meaning the pattern should be tested against all possible matches in a string.

So, what do you do to replace all occurrences matching a pattern? Nothing special. This behavior is implemented by default.

Let’s say you manage an Excel file with personal data. Some information is confidential, so before sharing this file with your colleagues, you want to replace sensitive info such as social security numbers (SSN) and individual taxpayer identification numbers (ITIN) with «CONF».

Given that both SSN and ITIN have the same format, you can find them using the below regular expression.

Since the 4 th instance_num argument of our function defaults to TRUE, you can safely omit it:

As the result, all substrings matching the regex are replaced with the specified text:

Regex to replace a specific instance

To replace just one occurrence matching a given pattern, define the corresponding number in the instance_num argument.

In the above example, supposing you wish to replace only social security numbers. In all cells, SSN is listed first, so we are replacing the 1 st instance:

=RegExpReplace(A5, $A$2, $B$2, 1)

Where $A$2 is the pattern and $B$2 is the replacement text.

Have you heard about the recent addition to our Ultimate Suite? I mean four powerful Regex Tools introduced in the latest version. Compared to their VBA counterparts, the Ablebits Regex functions have two main advantages:

  • You can use regular expressions in normal .xlsx workbooks without having to insert any code or enable macros in your Excel.
  • Processed by the standard .NET RegEx engine, these functions support full-featured classic regular expressions and overcome many limitations of VBA RegExp.

For more information, please see AblebitsRegexReplace function.

Below, you will find an example of Regex Replace that cannot be done with VBA.

How to replace strings using regular expressions

Let’s say you aim to replace text in square brackets with some character or string. The task can be accomplished with either a capturing group or positive look-arounds. The former is an easier way, so we’ll stick to it.

Generally, to find a character that is «special» in regular expressions, you need to put a backslash right before it. In regexes, acts as an escape character that cancels the special meaning of the following character and turns it into a literal character. So, to find a bracket, you prefix it with a backslash: [ to match an opening bracket and ] to match a closing bracket. Between the brackets, place a (capturing group). Depending on which quantifier you use in the group, different replacements will be made.

This pattern performs a greedy search — consumes as much as possible. The .* expression matches as many characters as possible, and then tries to match ]. So, this pattern captures everything from the first opening bracket to the last closing bracket.

This pattern performs a lazy search — consumes as little as possible. The question mark ? forces .* to match as few characters as possible until it finds the next match in the pattern, which is ]. So, this pattern captures everything from the first opening bracket to the first closing bracket.

One more way to match a substring in square brackets is to use a negation operator (^) inside the capturing group. From the first opening bracket, this pattern captures any characters other than a closing bracket, until it finds the first closing bracket. The result will be the same as with the lazy search.

Once you’ve decided on the regex, go «feed» it to the Ablebits Regex Replace function. Here’s how:

    On the Ablebits Data tab, in the Text group, click Regex Tools.
  • On the Regex Tools pane, configure these settings:
    • Select the source strings.
    • Enter your pattern.
    • Choose the Replace with option and type the replacement text in the box.
    • To have the results as formulas, not values, select the Insert as a formula check box.
    • Click the Replace button.

    At a moment’s notice, the AblebitsRegexReplace function is inserted in a new column to the right of your original data.

    =AblebitsRegexReplace(A2, «[(.*)]», «*»)

    The pattern and replacement text you specify go to the 2 nd and 3 rd arguments, respectively. Alternatively, you can keep them in separate cells, and supply the corresponding cell references. In our case, we enter the patterns in cells B2 and C2, type the replacement value in A2, then compare the results and choose the desired outcome:

    • The AblebitsRegexReplace function finds and replaces all matches.
    • The function can be inserted directly in a cell via the standard Insert Function dialog box, where it is categorized under AblebitsUDFs.

    That’s how to find and replace text strings in Excel using regular expressions. I thank you for reading and look forward to seeing you on our blog next week!

    Источник

  • Понравилась статья? Поделить с друзьями:
  • Regular expression find any word
  • Regex how to find a word
  • Regex for word matching
  • Regular expression exclude word
  • Regular expression any word match