Использование регулярных выражений: основы
Синтаксис регулярных выраженийРегулярные выражения предназначены для описания шаблонов, поиск совпадений с которыми будет производится в исходном тексте.СпецсимволыОбычные символы в регулярных выражениях означают буквальное совпадение с написанным текстом. Исключением являются служебные символы, например [ ] \ ^ $ . | ? * + ( ) { } < >Если в регулярном выражении требуется вставить совпадение с одним из служебных символов, его следует экранировать, поместив перед ним символ обратной дробной черты (\), например \+ \. \\ (для обозначения совпадения с символом обратной дробной черты). Экранирование неслужебных символов, не являющихся буквами, игнорируется, поэтому если вы сомневаетесь, является ли символ служебным, следует для надежности экранировать его. При экранировании символов 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». КвантификаторыЕсли необходимый нам символ может встречаться в строке определенное количество раз, то используются служебные символы-квантификаторы.
Если необходимо более точно указать количество совпадений, то применяется квантификатор в виде фигурных скобок: 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)», поскольку квантификатор * будет искать совпадение до последней закрывающей скобки, даже встретив первую.
Спецсимволы $ и ^Если символ ^ указать первым в регулярном выражении, то он будет означать, что совпадение должно начинаться с начала строки. Например, выражение ^a+, в строке «aaabbb» выделит «aaa», а в строке «bbbaaa» не найдет ни одного вхождения. Аналогично используется символ $ для обозначения конца строки. Например, выражение b+$, в строке «aaabbb» выделит «bbb», а в строке «bbbaaa» не найдет ни одного вхождения. В других позициях эти символы не имеют служебного значения. Приоритеты операций в регулярных выраженияхДля того, чтобы правильно составить выражение необходимо понимать порядок выполнения операций в нем: например, означает ли ab{3} три повторения ab или же a, за которым следует три буквы b? Для того, чтобы легко находить ответ на подобные вопросы следует рассмотреть регулярное выражение как выражение — т.е. последовательность операндов и операций, порядок выполнения которых определяется приоритетом операций (и, разумеется, использованием скобок). Операндами в случае регулярных выражений являются символы и символьные классы (в квадратных скобках). Выделяют четыре базовых типа операций:
Приоритеты этих операций следующие (от высшего к низшему):
Таким образом, конкатенация осуществляется после применения квантификатора, но до альтернативы. То есть в приведенном выше примере ab{3} сначала будет применен квантификатор (к одной букве b), а лишь затем — конкатенация букв a и повторенной три раза b. Наоборот, альтернатива применяется позже конкатенации, поэтому ab|cd означает ab или cd, а не abd или acd. Для управления этим процессом в регулярных выражениях используются круглые скобки: если нам нужно получить ab три раза, то выражение будет выглядеть (ab){3}. Соответственно выражение a(b|c)d совпадает со строками abd и acd. Контрольные вопросы для закрепления материала:
© ВолгГТУ, Сычёв Олег Александрович, кафедра ПОАС Добавил: COBA (04.03.2011) | Категория: Технологии программирования Просмотров: 8306 | Загрузок: 0 | Рейтинг: 3.1/7 | Теги: |
Комментарии (0) | |