А АWednesday, 1 April 2020

Регулярные выражения и Excel.

Всем привет.

Каждый из вас слышал про Регулярные выражения (Regexp). Они применимы в почти в любом языке программирования и многих редакторах.

Regexp представляет собой группу символов или знаков, которая используется для поиска определенного текстового шаблона. Другими словами Регулярное выражение – это шаблон, который обработчик регулярных выражений пытается сопоставить с введенным текстом. Шаблон состоит из одно-символьных или много-символьных литералов, операторов или конструкций. 


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

Regexp можно использовать даже в Excel. Но, скажете вы,  в уважаемом Excel есть же функция ПОИСК(искомый_текст;текст_для_поиска;нач_позиция).

Где Искомый_текст — это искомый текст. Можно использовать символы шаблона знак вопроса (?) и звездочка (*) в аргументе искомый_текст. Знак вопроса соответствует любому символу; звездочка соответствует любой последовательности символов. Если нужно найти символ знак вопроса или звездочку, то следует поставить перед ними знак тильда (~). Если искомый_текст не найден, то возвращается значение ошибки #ЗНАЧ!.

Текст_для_поиска — это текст, в котором нужно найти искомый_текст.

Нач_позиция — это номер символа в тексте текст_для_поиска, с которого следует начать поиск.

Если аргумент опущен, то он полагается равным 1.

Если нач_позиция не больше 0 или больше, чем длина аргумента текст_для_поиска, то возвращается значение ошибки #ЗНАЧ!.

Зачем мне что-то еще?



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

Например:

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

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

Все, начинка для Excel готова. Подробнее как с этим работать читайте здесь.

Для любопытных могу рекомендовать книги про RegExp:

  1. Бен Форта - Регулярные выражения (10 минут на урок), 2005
  2. Джеффри Фридл - Регулярные выражения, 3-е издание, 2008
  3. Фицджеральд М. - Регулярные выражения, Основы, 2015
  4. Ян Гойвертс, Стивен Левитан - Регулярные выражения. Сборник рецептов, 2-е издание, 2015.

Они легко находятся  в сети. Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?

Версия на печать

Популярное