Главная Технологии программирования » Файлы » Методички » Технологии программирования [ Добавить материал ]

Использование регулярных выражений: основы

Синтаксис регулярных выражений

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

Спецсимволы

Обычные символы в регулярных выражениях означают буквальное совпадение с написанным текстом. Исключением являются служебные символы, например [ ] \ ^ $ . | ? * + ( ) { } < >

Если в регулярном выражении требуется вставить совпадение с одним из служебных символов, его следует экранировать, поместив перед ним символ обратной дробной черты (\), например \+ \. \\ (для обозначения совпадения с символом обратной дробной черты). Экранирование неслужебных символов, не являющихся буквами, игнорируется, поэтому если вы сомневаетесь, является ли символ служебным, следует для надежности экранировать его. При экранировании символов a, b, f, n, t, v или r, они будут соответствовать служебным последовательностям в строковых константах языка С. Например, \n — перенос строки, \t — символ табуляции.

Символьный класс

Символьный класс используется в случае, если в каком-либо месте шаблона может присутствовать любой из определенного множества символов. Символьный класс описывается в квадратных скобках перечислением всех входящих символов. Например, символьному классу [123] соответствуют строки «1», «2» и «3».

В символьном классе можно указать диапазон символов, используя символ -. Например классу [0-5], соответствует любой символ от «0» до «5»; [a-z] — любая строчная латинская буква. Можно использовать в одном классе и диапазоны, и конкретные значения. Например, класс[0-3aA-Z] — даст совпадение с любой цифрой от 0 до 3, буквой a, либо любой заглавной латинской буквой. Примеры некорректных диапазонов: [a-Z] (надо указывать символы одного регистра, в таких случаях необходимо писать [a-zA-Z]), [0-a] (не может быть диапазона между буквой и цифрой), [%-&] (диапазоны нецифровых и небуквенных символов недопустимы).

Если требуется указать совпадение с любыми символами кроме определенных, то сразу за открывающей квадратной скобкой ставится знак отрицания ^. Например, выражению [^1-3] соответствует любая строка из одного символа, кроме «1», «2» и «3». Внутри квадратных скобок обычные служебные символы теряют свои значения и не требуют экранирования; служебными считается лишь символы ] (конец класса), ^ (отрицание, только если стоит сразу за открывающей скобкой), - (диапазон символов) и \ (символ экранирования).

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


Конкатенация

Для указания того, что символы при совпадении должны следовать друг за другом, используется конкатенация. Символы (или символьные классы) в шаблоне указываются непосредственно друг за другом. Например, выражению 12 соответствует строка «12», выражению 1[0-9] соответствует любое двузначное число, начинающееся с единицы.


Варианты, альтернативы

Для задания вариантов строк в регулярных выражениях используется перечисление. Варианты записываются через вертикальную черту |. Например выражению for|while|if, соответствуют строки «for», «if» и «while». В случае одиночных символов эффективнее использовать символьный класс. Если варианты составляют только часть совпадения, то их следует заключить в круглые скобки, при этом один из вариантов может быть пустым, например (do |)while будет соответствовать строкам «do while» или «while».


Квантификаторы

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

  • Квантификатор + означает, что предшествующий ему символ (символьный класс, выражение в скобках) может встречаться любое количество раз, но как минимум один;
  • квантификатор * - ни разу или любое количество раз;
  • Квантификатор ? - ни разу или один раз.
  • Квантификатор {} - строго заданное количество раз
Например, выражение ab? означает «a» или «ab», a+b означает «ab», «aab» и т.д. с любым количеством букв «a»; a*b — «b», «ab», «aab» и т.д.

Если необходимо более точно указать количество совпадений, то применяется квантификатор в виде фигурных скобок: a{3} означает ровно три буквы «a», a{1,3} — любое количество от одного до трех, a{,3} — любое количество от нуля до трех, a{3,} - не менее трех букв «а».

При применении квантификаторов к символьному классу или выражению в скобках с применением вертикальной черты следует помнить, что варианты при каждой подстановке могут быть различными, т.е. [ab]{2} даст совпадение не только с «aa» и «bb», но и с «ab» и «ba».

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

Рассмотрим регулярное выражение \(.*\). Оно должно находить любые строки, заключенные в скобки. Если строка для поиска будет такой «(12345)2341», то совпадение будет «(12345)». Но если строка будет такой «0(12345)124(32521)7», то мы получим не два совпадения, а одно «(12345)124(32521)», поскольку квантификатор * будет искать совпадение до последней закрывающей скобки, даже встретив первую.

Для решения этой проблемы существует 2 способа:

  • при поиске символов внутри скобок указать любые символы кроме закрывающей скобки: \([^)\n]*\)
  • использовать «нежадные» квантификаторы, которые ищут минимальное по длине совпадение, указав ? сразу после квантификатора (*): \(.*?\)
В этом случае будут найдены обе строки, что и требовалось.


Спецсимволы $ и ^

Если символ ^ указать первым в регулярном выражении, то он будет означать, что совпадение должно начинаться с начала строки. Например, выражение ^a+, в строке «aaabbb» выделит «aaa», а в строке «bbbaaa» не найдет ни одного вхождения. Аналогично используется символ $ для обозначения конца строки. Например, выражение b+$, в строке «aaabbb» выделит «bbb», а в строке «bbbaaa» не найдет ни одного вхождения. В других позициях эти символы не имеют служебного значения.


Приоритеты операций в регулярных выражениях

Для того, чтобы правильно составить выражение необходимо понимать порядок выполнения операций в нем: например, означает ли ab{3} три повторения ab или же a, за которым следует три буквы b? Для того, чтобы легко находить ответ на подобные вопросы следует рассмотреть регулярное выражение как выражение — т.е. последовательность операндов и операций, порядок выполнения которых определяется приоритетом операций (и, разумеется, использованием скобок). Операндами в случае регулярных выражений являются символы и символьные классы (в квадратных скобках).

Выделяют четыре базовых типа операций:

  • конкатенация — простое следование одного операнда за другим, т.е. ab означает совпадение сначала с a и следующей за ней b;
  • круглые скобки — определяют группировку выражений и позволяют менять приоритет;
  • квантификаторы — позволяют задавать количество повторений образца шаблона: это символы ? + и *, а также числа или интервалы в фигурных скобках;
  • операцию альтернативы — вертикальную черту.

Приоритеты этих операций следующие (от высшего к низшему):

  1. круглые скобки,
  2. квантификатор,
  3. конкатенация,
  4. альтернатива.

Таким образом, конкатенация осуществляется после применения квантификатора, но до альтернативы. То есть в приведенном выше примере ab{3} сначала будет применен квантификатор (к одной букве b), а лишь затем — конкатенация букв a и повторенной три раза b. Наоборот, альтернатива применяется позже конкатенации, поэтому ab|cd означает ab или cd, а не abd или acd.

Для управления этим процессом в регулярных выражениях используются круглые скобки: если нам нужно получить ab три раза, то выражение будет выглядеть (ab){3}. Соответственно выражение a(b|c)d совпадает со строками abd и acd.


Контрольные вопросы для закрепления материала:
  1. Использование символа ^ в синтаксисе регулярных выражений
  2. Использование символа $ в синтаксисе регулярных выражений
  3. Символьный класс и способы его задания.
  4. Операции-квантификаторы в регулярных выражениях.
  5. Сравните приоритет операций конкатенации, альтернативы (|) и квантификатора в регулярных выражениях.
  6. Составьте регулярное выражение, под которое подходят все правильно заданные адреса электронной почты.
  7. Составьте регулярное выражение, под которое подходят все правильно заданные адреса web-страниц
  8. Составьте регулярное выражение, под которое подходят все правильно заданные пути к файлам в ОС Unix
  9. Составьте регулярное выражение, под которое подходят все правильно заданные пути к файлам в ОС Windows
  10. Укажите все варианты, совпадающие с регулярным выражением ab|cd{2,3}
  11. Укажите все варианты, совпадающие с регулярным выражением (ab|cd){2,3}
  12. Укажите все варианты, совпадающие с регулярным выражением [ab]|[cd]{2,3}
  13. Укажите все варианты, совпадающие с регулярным выражением ([ab]|[cd]){2,3}

© ВолгГТУ, Сычёв Олег Александрович, кафедра ПОАС

Похожие материалы:

Добавил: COBA (04.03.2011) | Категория: Технологии программирования
Просмотров: 8155 | Загрузок: 0 | Рейтинг: 3.1/7 |
Теги: Регулярные выражения
Комментарии (0)

Имя *:
Email *:
Код *: