Применение регулярных выражений

Материал из Deeptown Manual
Перейти к: навигация, поиск

Страница находится в стадии разработки

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

Предположим, что нам необходимо запросить у пользователя координаты нескольких точек на плоскости. Это можно сделать путем последовательного запроса координат X и Y. При этом, диалог пользователя и компьютера может выглядеть примерно так:

Введите координату X точки 1: 14
Введите координату Y точки 1: 2
Введите координату X точки 2: 22
Введите координату Y точки 2: 14
...

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

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

Введите координаты точек: (14, 2) (22, 14) (37, 5) (16, 2)

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

  • отделить пары координат друг от друга
  • убрать лишнюю информацию (скобки)
  • разобрать координаты

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

Введите координаты точек: (14,2) (22,   14) (37,5)(16,2)

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

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

  • Пары координат заключены в круглые скобки
  • Координаты отделяются друг от друга с помощью запятой
  • Пробелы не значимы

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

(14, 2) (22, 14) (37, 5) (16, 2)
(14,2) (22,   14) (37,5)(16,2)
(14,2)(22,14)(37,5)(16,2)
(  14 ,   2 ) ( 22 ,  14) ( 37,5)   (16,    2)


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

Зачем нужны регулярные выражения

Регулярные выражения позволяют в краткой форме описывать некоторое множество строк и извлекать из него информацию на основе подмеченных закономерностей. Приведем пример кода, разбирающий вышеописанную строку с координатами точек: <source lang=kpp> //здесь будет код </source>

Преимущества регулярных выражений

Применение регулярных выражений на примере разбора лог файла

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

Персональные инструменты
Пространства имён

Варианты
Действия
Навигация
информация
документация
Инструменты