Шаблоны поиска

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

Предположим, перед нами – достаточно монотонный текст, состоящий из букв, пунктуации и пробелов. Это может быть html -страница текста, полная рекламы, модулей и ссылок; но небольшая часть этого текста носит важный для нас смысл. Мы хотели бы разметить этот фрагмент текста какими-либо жесткими правилами, однако это невозможно. На начало нужного фрагмента в тексте указывают лишь косвенные признаки, – например, наличие даты, времени публикации и имени автора в следующем формате: «12.08.2018 01:20, АНАТОЛИЙ ИВАНОВ». Строка перед ним – содержит только название статьи, а после и до него – ряды случайных символов.

Эти данные – всегда разные, но формат их записи всегда один. Как нам прочитать их в случайном месте текста?

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

В чем состоит идея:

1. «Прочитать» строку текста, размечая встреченные группы символов одной из нескольких меток. Например, все буквы русского алфавита мы можем пометить «0», пунктуацию – «1», числа – «2», английские буквы – «3», символьные команды и псевдографику «4» и «5», а пробелы – «6». (Согласно этой схеме, упомянутый выше шаблон без имени автора мы могли бы записать как последовательность «22122122226221221»).

2. В «клоне» строки, размеченной полученным кодом мы находим искомый шаблон.

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


Илл. 38. Функция Shablon – определяет наличие в строке шаблона поиска, и возвращает подстроку s2 с указанным в шаблоне фрагментом текста.


Как видно, функция довольно проста, но здесь были использованы некоторые жизненные «лайфхаки». Поскольку бывает довольно сложно проконтролировать всю палитру диапазонов таблицы символов, здесь введена дополнительная переменная логического типа «plus», которая содержит информацию, об использовании очередного символа из строки в шаблоне. Если мы пропустили какой-то символ (if plus=false) после проверки всех полезных для нас вариантов, тогда мы добавляем символ кода «5» в S3 (там может оказаться псевдографика, командные символы и т.п.). В таком случае длина строки, содержащая код шаблона S3 не будет отличаться от исходной S. Также, для того, чтобы каждый раз не проверять код текущего символа из исходника S, мы присвоили его значение переменной j, что ускоряет время исполнения.

По окончании кодирования строки, мы выполняем поиск подстроки SS в полученной строке S3, и копируем фрагмент из реальной строки S с позиции строки полученного шаблона S3 и с длиной подстроки шаблона SS. Фрагмент «S2:=copy (s, pos (ss, s3), length (ss));»

Проверим корректность процедуры:


Илл. 39. Проверка функции shablon в программе.


И вот результат:


Илл. 40. Результат работы программы с использованием функции shablon.


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