Регулярное выражение — это шаблон (образец), по которому выполняется поиск соответствующего ему фрагмента текста. Язык описания регулярных выражений состоит из символов двух видов: обычных и метасимволов. Обычный символ представляет в выражении сам себя, а метасимвол — некоторый класс символов, например любую цифру или букву.
Например, регулярное выражение для поиска в тексте фрагмента «Вася» записывается с помощью четырех обычных символов Вася, а выражение для поиска двух цифр, идущих подряд, состоит из двух метасимволов \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






