Регулярное выражение — это шаблон (образец), по которому выполняется поиск соответствующего ему фрагмента текста. Язык описания регулярных выражений состоит из символов двух видов: обычных и метасимволов. Обычный символ представляет в выражении сам себя, а метасимвол — некоторый класс символов, например любую цифру или букву.
Например, регулярное выражение для поиска в тексте фрагмента «Вася» записывается с помощью четырех обычных символов Вася, а выражение для поиска двух цифр, идущих подряд, состоит из двух метасимволов \d\d.
С помощью комбинаций метасимволов можно описывать сложные шаблоны для поиска. Например, можно описать шаблон для IP-адреса, адреса электронной почты, различных форматов даты, заголовков определенного вида и т. д.
ПРИМЕЧАНИЕ
Синтаксис регулярных выражений.NET в основном позаимствован из языка Perl 5. Неподготовленного человека вид сложного регулярного выражения может привести в замешательство, но при вдумчивом изучении он обязательно почувствует его красоту и очарование. Пожалуй, регулярные выражения более всего напоминают заклинания, по которым волшебным образом преобразуется текст. Ошибка всего в одном символе делает заклинание бессильным, зато, верно составленное, оно творит чудеса!
|
|
В табл. 15.2 описаны наиболее употребительные метасимволы, представляющие собой классы символов.
Метасимволы, перечисленные в табл. 15.3, уточняют позицию в строке, в которой следует искать совпадение с регулярным выражением, например, только в начале или в конце строки. Эти метасимволы являются мнимыми, то есть в тексте им не соответствует никакой реальный символ.
Таблица 15.2. Классы символов
Класс символов | Описание | Пример |
. | Любой символ, кроме \n | Выражение С. t cсоответствует |
фрагментам cat, cut, clt, c{t и т. д. | ||
[] | Любой одиночный символ из последовательности, записанной внутри скобок. Допускается использование диапазонов символов | Выражение c[aul]t соответствует фрагментам cat, cut и clt, а выражение c[a-z]t — фрагментам cat, cbt, cct, cdt,..., czt |
[^] | Любой одиночный символ, не | Выражение c[^aul]t |
входящий в последовательность, | соответствует фрагментам cbt, | |
записанную внутри скобок. | c2t, cXt и т. д., а выражение | |
Допускается использование | c[^a-zA-Z]t — фрагментам C и t, | |
диапазонов символов | clt, c4t, c3t и т. д. | |
\w | Любой алфавитно-цифровой | Выражение c\wt соответствует |
символ, то есть символ из | фрагментам cat, cut, clt, cK)t | |
множества прописных и строчных | и т. д., но не соответствует | |
букв и десятичных цифр | фрагментам c{t, c;t и т. д. | |
\W | Любой не алфавитно-цифровой | Выражение c\Wt соответствует |
символ, то есть символ, | фрагментам c{t, C;t, С t и т. д., | |
не входящий в множество | но не соответствует фрагментам | |
прописных и строчных букв | cat, cut, clt, cЮt и т. д. | |
и десятичных цифр | ||
\s | Любой пробельный символ, | Выражение \s\w\w\w\s |
например символ пробела, | соответствует любому слову | |
табуляции (\t, \v), перевода | из трех букв, окруженному | |
строки (\n, \r), новой | пробельными символами | |
страницы (\f) | ||
\S | Любой не пробельный символ, | Выражение \s\S\S\s |
то есть символ, не входящий | соответствует любым двум | |
в множество пробельных | непробельным символам, | |
окруженным пробельными | ||
\d | Любая десятичная цифра | Выражение c\dt соответствует |
фрагментам c1t, c2t,..., c9t | ||
\D | Любой символ, не являющийся | Выражение c\Dt не соответствует |
десятичной цифрой | фрагментам c1t, c2t,..., c9t |
Таблица 15.3. Уточняющие метасимволы
|
|
Метасимвол | Описание |
^ | Фрагмент, совпадающий с регулярным выражением, следует искать только в начале строки |
$ | Фрагмент, совпадающий с регулярным выражением, следует искать только в конце строки |
\А | Фрагмент, совпадающий с регулярным выражением, следует искать только в начале многострочной строки |
\Z | Фрагмент, совпадающий с регулярным выражением, следует искать только в конце многострочной строки |
\b | Фрагмент, совпадающий с регулярным выражением, начинается или заканчивается на границе слова (то есть между символами, соответствующими метасимволам \w и \W) |
\B | Фрагмент, совпадающий с регулярным выражением, не должен встречаться на границе слова |
Например, выражение ^cat соответствует символам cat, встречающимся в начале строки, выражение cat$ — символам cat, встречающимся в конце строки (то есть за ними идет символ перевода строки), а выражение ^$ представляет пустую строку, то есть начало строки, за которым сразу же следует ее конец.
В регулярных выражениях часто используют повторители. Повторители — это метасимволы, которые располагаются непосредственно после обычного символа или класса символов и задают количество его повторений в выражении. Например, если требуется записать выражение для поиска в тексте пяти идущих подряд цифр, вместо метасимволов \d\d\d\d\d можно записать \d{5}. Такому выражению будут соответствовать фрагменты 11111, 12345, 53332 и т. д.
Наиболее употребительные повторители перечислены в табл. 15.4.
Таблица 15.4. Повторители
Метасимвол | Описание | Пример |
* | Ноль или более повторений предыдущего элемента | Выражение ca*t соответствует фрагментам ct, cat, caat, caaaaaaaaaaat и т. д. |
+ | Одно или более повторений предыдущего элемента | Выражение ca+t соответствует фрагментам cat, caat, caaaaaaaaaaat и т. д. |
? | Ни одного или одно повторение предыдущего элемента | Выражение ca?t соответствует фрагментам ct и cat |
{n} | Ровно n повторений предыдущего элемента | Выражение ca{3}t соответствует фрагменту caaat, а выражение (cat){2}— фрагменту catcat (круглые скобки служат для группировки символов) |
{n,} | По крайней мере n повторений предыдущего элемента | Выражение са{3,}t соответствует фрагментам caaat, caaaat, caaaaaaaaaaaat и т. д. |
{n,m} | От n до m повторений предыдущего элемента | Выражение ca{2,4}t соответствует (фрагментам caat. caaat и caaaat. |
Помимо рассмотренных элементов регулярных выражений можно использовать конструкцию выбора из нескольких элементов. Варианты выбора перечисляются через вертикальную черту. Например, если требуется определить, присутствует ли в тексте хотя бы один элемент из списка «cat», «dog» и «horse», можно использовать выражение
cat|dog|horse
При поиске используется так называемый «ленивый» алгоритм, по которому поиск прекращается при нахождении самого короткого из возможных фрагментов, совпадающих с регулярным выражением.
|
|
Примеры простых регулярных выражений:
□ целое число (возможно, со знаком):
[-+]?\d+
□ вещественное число (может иметь знак и дробную часть, отделенную точкой):
[-+]?\d+\.?\d*
□ российский номер автомобиля (упрощенно):
[A-Z]\d{3}[A-Z]{2}\d\dRUS