Oc-windows.ru

IT Новости из мира ПК
3 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Регулярные выражения excel замена

VBA Excel. Регулярные выражения (объекты, свойства, методы)

Регулярные выражения в VBA Excel. Объекты RegExp, Match, Matches Collection и их свойства. Символы и метасимволы. Создание объекта RegExp с ранней, поздней привязкой и его методы.

В VBA Excel для работы с регулярными выражениями используется библиотека «Microsoft VBScript Regular Expression».

Создание объекта RegExp

Ранняя привязка

Обычно рекомендуется использовать объекты с ранней привязкой, так как у них выше быстродействие, а также при написании и редактировании кода доступны подсказки в виде листа свойств-методов, появляющегося автоматически или вызываемого, при необходимости, сочетанием клавиш Ctrl+Пробел.

Раннее связывание заключается в присвоении нового экземпляра объекта RegExp переменной, уже объявленной, как переменная определенного типа (в нашем случае, как RegExp).

Для осуществления ранней привязки необходимо подключить к проекту VBA ссылку на библиотеку «Microsoft VBScript Regular Expression», для чего в редакторе VBA выбираем Tools – References…

В открывшемся окне «References» находим строку «Microsoft VBScript Regular Expression 5.5» (если у вас ее нет, то строку «Microsoft VBScript Regular Expression 1.0»), отмечаем ее галочкой и нажимаем «ОК».

Готово – ссылка добавлена.

Создание объекта RegExp с ранней привязкой:

Поздняя привязка

Позднее связывание заключается в присвоении нового экземпляра объекта RegExp переменной, объявленной как Object, с помощью функции CreateObject.

Создание объекта RegExp с поздней привязкой:

Свойства и методы объекта RegExp

Свойства объекта RegExp

СвойствоОписаниеЗначение
по умолчанию
GlobalОпределяет продолжительность поиска:
False – до первого совпадения
True – по всему тексту
False
IgnoreCaseОпределяет чувствительность к регистру символов:
False – учитывать регистр
True – не учитывать регистр
False
MultilineОпределяет структуру объекта:
False – однострочный
True – многострочный
False
PatternСтрока, используемая как шаблонПустая строка

Свойства объекта RegExp доступны для чтения и записи.

Методы объекта RegExp

МетодСинтаксисОписание
ExecuteExecute(myStr)
myStr – строка для поиска
Возвращает коллекцию найденных по шаблону подстрок в виде агрегатного объекта
ReplaceReplace(myStr,myRep)
myStr – строка для поиска
myRep – строка для замены
Возвращает строку, в которой найденные по шаблону вхождения в исходной строке заменены на указанную подстроку.
TestTest(myText)
myText – строка для проверки
Возвращает булево значение как результат проверки соответствия строки шаблону

Свойства объектов Match и Matches Collection

Метод Execute объекта RegExp возвращает агрегатный объект Matches Collection, который содержит коллекцию объектов Match, представляющих все совпадения, найденные механизмом регулярных выражений, в том порядке, в котором они присутствуют в исходной строке. Если совпадений нет, метод возвращает объект Matches Collection без членов.

Свойства объекта Matches Collection

СвойствоОписание
CountКоличество объектов Match, содержащихся в объекте Matches Collection
ItemИндекс члена коллекции от нуля до значения свойства Count минус 1

Свойства объекта Matches Collection доступны только для чтения.

Свойства объекта Match

СвойствоОписание
FirstIndexПозиция в исходной строке, где произошло совпадение, причем первая позиция в строке равна нулю
LengthДлина совпавшей подстроки
ValueНайденная подстрока (является свойством по умолчанию)

Свойства объекта Match доступны только для чтения.

Символы и метасимволы

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

Метасимвол
(сочетание символов)
Значение
После этого знака метасимвол обозначает сам себя, а некоторые символы приобретают другое значение
^Начало строки
$Конец строки
?Ни одного или один любой символ
*Ни одного или несколько любых символов
+Один или несколько любых символов
.Любой символ, кроме знака “новая строка”
Определяет интервал символов
|Знак “или”
Точное количество символов, стоящих перед
Количество от n до m символов, стоящих перед
[abc]Любой из указанных символов
[^abc]Любой из неуказанных символов
[a-z]Любой символ из диапазона
[^a-z]Любой символ, не входящий в диапазон
bКонец слова
BНе конец слова
dЦифра
DНе цифра
wЛюбая буква, цифра или знак подчеркивания
WНе буква, не цифра и не знак подчеркивания
sПробел
SНе пробел

В таблицу не включены редко используемые сочетания, ознакомиться с которыми можно в справочной системе разработчика. А примеры использования метасимволов в шаблонах очень хорошо представлены на этом ресурсе в разделе 4. Метасимволы.

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

Зачастую, при работе с многочисленными выгрузками в 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

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

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

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

Функции регулярных выражений в Excel

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

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

REGEXMATCH возвращает Истина или Ложь (TRUE или FALSE в английской версии Excel), в зависимости от того, соответствует текст паттерну или нет.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заметка написана Андреем Макаренко

Регулярные выражения (regular expressions) — очень мощный механизм для обработки строк. С его помощью можно найти нужные части текста, проверить, удовлетворяет ли строка определённой маске, заменить найденный текст. Такие выражения вcтроены во многие языки программирования, такие, как Perl, Php, JavaScript, и, конечно VBA.

Рассмотрим, как это работает на примере обработки счетов на доставку товаров. Исходные данные содержатся в отчете Excel в форме полного адреса (рис. 1). Наша задача — из строки вида «677000, Россия, Саха /Якутия/ Респ., г. Якутск, ул. Ойунского» выделить название города.

Рис. 1. Исходные данные

Скачать заметку в формате Word или pdf, примеры в архиве (политика провайдера не позволяет напрямую загружать на сайт файлы Excel, содержащие макросы)

Для использования регулярных выражений, необходимо подключить библиотеку MS Windows Script. Для подключения, запускаем VBA (меню Разработчик –> Visual Basic). В открывшемся окне VBA проходим по меню Tools –> References и в окне References — VBAProject ставим флажок в строке Microsoft VBScript Regular Expressions 5.5 (рис. 2).

Рис. 2. Подключение библиотеки MS Windows Script для работы с регулярными выражениями

Теперь в Visual Basic добавился объект RegExp, который содержит в себе всё, что нужно для работы с регулярными выражениями. Код, выполняющий поставленную задачу, выглядит так:

Sub RegExp()
Dim myRegExp As New RegExp ‘ создаем экземпляр RegExp
Dim aMatch As Match ‘ один из совпавших образцов
Dim colMatches As MatchCollection ‘ коллекция этих образцов
Dim strTest As String ‘ тестируемая строка

‘ устанавливаем свойства объекта RegExp
myRegExp.Global = False ‘ если Global = True, то поиск ведётся во всей строке, _
если False, то только до первого совпадения
myRegExp.IgnoreCase = True ‘ игнорировать регистр символов при поиске
myRegExp.Pattern = » , (г|c|п). .*?, » ‘ шаблон для поиска

strTest = Sheets( » Накладные » ).Range( » E2 » ).Text ‘ присваиваем переменной текст из текущей ячейки
Set colMatches = myRegExp.Execute(strTest) ‘ получаем коллекцию совпадений с образцом

‘ перебираем коллекцию и просматриваем результаты
For Each aMatch In colMatches ‘ проходим по всей коллекции
a = aMatch.FirstIndex ‘ порядковый номер первого символа найденного образца
b = aMatch.Length ‘ кол-во символов в найденном образце
c = aMatch.Value ‘ полный образец
Next aMatch

c = Mid(c, 6, Len(c) — 6)
MsgBox a & » | » & b & » | » & c ‘ смотрим, что получилось

‘ производим замену найденного выражения
d = myRegExp.Replace(strTest, » (здесь раньше был город) » )

MsgBox d ‘ смотрим, что получилось
End Sub

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

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

Описание синтаксиса для создания шаблона можно найти в Интернете (см., например, msdn). Здесь я дам лишь краткое представление о возможностях (рис. 3) и прокомментирую шаблон, использованный в примере.

Рис. 3. Специальные символы

Разберем использованный нами в примере шаблон:

Сам шаблон берется в кавычки. Начинается шаблон с запятой и пробела, далее следует конструкция (г|c|п), которая позволят выбрать один из трех вариантов обозначения населенного пункта: г – город, с – село, п – поселок.

. — это просто точка. Обратная косая поставлена для того, чтобы отличить ее от спецсимвола

пробел — это и есть пробел

. — точка — любой символ

* — множитель, берет ни одного или множество символов, стоящих слева от него (а это точка – то есть, любой символ) между пробелом и запятой

? — ограничивает поиск первой встреченной запятой. Если его не использовать, то выражение вернет значение » , г. Якутск, ул. Ойунского, » . Т.е., до последней запятой в тексте.

Итак, шаблон позволяет найти текст, который начинается с запятой, пробела, буквы («г», «с» или «п») с точкой и пробела, а заканчивается первой встреченной после этого запятой. В нашем случае шаблон извлекает следующий текст:

Далее оператор c = Mid(c, 6, Len(c) — 6) оставляет от него лишь

Читать еще:  Открыть приложение word
Ссылка на основную публикацию
Adblock
detector