Если требуется описать в выражении обычный символ, совпадающий с каким-либо метасимволом, его предваряют обратной косой чертой. Так, для поиска в тексте символа точки следует записать \., а для поиска косой черты — \ \.
Например, для поиска в тексте имени файла cat.doc следует использовать регулярное выражение cat\.doc. Символ «точка» экранируется обратной косой чертой для того, чтобы он воспринимался не как метасимвол «любой символ» (в том числе и точка!), а непосредственно1.
Для группирования элементов выражения используются круглые скобки. Группирование применяется во многих случаях, например, если требуется задать повторитель не для отдельного символа, а для последовательности (это использовано в предыдущей таблице). Кроме того, группирование служит для запоминания в некоторой переменной фрагмента текста, совпавшего с выражением, заключенным в скобки. Имя переменной задается в угловых скобках или апострофах:
(?<имя_переменной>фрагмент_выражения)
Фрагмент текста, совпавший при поиске с фрагментом регулярного выражения, заносится в переменную с заданным именем. Пусть, например, требуется выделить из текста номера телефонов, записанных в виде nnn-nn-nn. Регулярное выражение для поиска номера можно записать так:
|
|
(?<num>\d\d\d-\d\d-\d\d)
Обратите внимание на то, что метасимволы регулярных выражений не совпадают с метасимволами, которые используются в шаблонах имен файлов, таких как *.doc.
При анализе текста в переменную с именем num будут последовательно записываться найденные номера телефонов.
Рассмотрим еще один вариант применения группирования — для формирования обратных ссылок. Все конструкции, заключенные в круглые скобки, автоматически нумеруются, начиная с 1. Эти номера, предваренные обратной косой чертой, можно использовать для ссылок на соответствующую конструкцию. Например, выражение (\w)\l используется для поиска сдвоенных символов в словах (wall, mass, cooperate) - если написать просто \w\w, будут найдены все пары алфавитно-цифровых символов.
Круглые скобки могут быть вложенными, при этом номер конструкции определяется порядком открывающей скобки в выражении. Примеры:
(Вася)\s+(должен)\s+(?<sum>\d+)\sруб\.\s+Ну что же ты. \1
В этом выражении три подвыражения, заключенных в скобки. Ссылка на первое из них выполняется в конце выражения. С этим выражением совпадут, например, фрагменты
Вася должен 5 руб. Ну что же ты. Вася
Вася должен 53459 руб. Ну что же ты. Вася
Выражение, задающее IP-адрес:((\d{l,3}\.){3}\d{1,3})
Адрес состоит из четырех групп цифр, разделенных точками. Каждая группа может включать от одной до трех цифр. Примеры IP-адресов: 212.46.197.69, 212.194.5.106, 209.122.173.160. Первая группа, заключенная в скобки, задает весь адрес. Ей присваивается номер 1. В нее вложены вторые скобки, определяющие границы для повторителя {3}.
|
|
Переменную, имя которой задается внутри выражения в угловых скобках, также можно использовать для обратных ссылок в последующей части выражения. Например, поиск двойных символов в словах можно выполнить с помощью выражения (?<s>\w)\k<s>, где s — имя переменной, в которой запоминается символ, \к — элемент синтаксиса.
В регулярное выражение можно помещать комментарии. Поскольку выражения обычно проще писать, чем читать, это — очень полезная возможность. Комментарий либо помещается внутрь конструкции (?#), либо располагается, начиная от символа # до конца строки (для распознавания этого вида комментария должен быть включен режим х RegexOptions. IgnorePatternWhitespace).