Интернет-журнал "Домашняя лаборатория", 2007 №9
Шрифт:
Определим класс языков, задаваемых регулярными множествами. Регулярное множество определяется рекурсивно следующими правилами:
• пустое множество, а также множество, содержащее пустое слово, и одноэлементные множества, содержащие символы алфавита, являются регулярными базисными множествами;
• если множества P и Q являются регулярными, то множества, построенные применением операций объединения, конкатенации и итерации — P>>Q, PQ, P*, Q* — тоже являются регулярными.
Регулярные выражения представляют удобный способ задания регулярных
• регулярные базисные выражения задаются символами и определяют соответствующие регулярные базисные множества, например, выражение f задает одноэлементное множество {f} при условии, что f — символ алфавита T;
• если P и Q — регулярные выражения, то операции объединения, конкатенации и итерации — P+Q, PQ, P*, Q* — являются регулярными выражениями, определяющими соответствующие регулярные множества.
По сути, регулярные выражения — это более простой и удобный способ записи регулярных множеств в виде обычной строки. Каждое регулярное множество, а, следовательно, и каждое регулярное выражение задает некоторый язык L(T) в алфавите T. Этот класс языков — достаточно мощный, с его помощью можно описать интересные языки, но устроены они довольно просто — их можно определить также с помощью простых грамматик, например, правосторонних грамматик. Более важно, что для любого регулярного выражения можно построить конечный автомат, который распознает, принадлежит ли заданное слово языку, порожденному регулярным выражением. На этом основана практическая ценность регулярных выражений.
С точки зрения практика регулярное выражение задает образец поиска. После чего можно проверить, удовлетворяет ли заданная строка или ее подстрока данному образцу. В языках программирования синтаксис регулярного выражения существенно обогащается, что дает возможность более просто задавать сложные образцы поиска. Такие синтаксические надстройки, хотя и не меняют сути регулярных выражений, крайне полезны для практиков, избавляя программиста от ненужных сложностей. (В Net Framework эти усложнения, на мой взгляд, чрезмерны. Выигрывая в мощности языка, проигрываем в простоте записи его выражений.)
Синтаксис регулярных выражений
Регулярное выражение на C# задается строковой константой. Это может быть обычная или @-константа Чаще всего, следует использовать именно @– константу. Дело в том, что символ "\" широко применяется в регулярных выражениях как для записи escape-последовательностей, так и в других ситуациях. Обычные константы в таких случаях будут выдавать синтаксическую ошибку, а @– константы не выдают ошибок и корректно интерпретируют запись регулярного выражения.
Синтаксис регулярного выражения простой формулой не описать, здесь используются набор разнообразных средств:
• символы и escape-последовательности;
• символы операций и символы, обозначающие специальные классы множеств;
• имена групп и обратные ссылки;
• символы утверждений и другие средства.
Конечно, регулярное выражение может быть совсем простым, например,
Повторяю, данная таблица не полна. В ней не отражены, например, такие категории, как подстановки, обратные ссылки, утверждения.
Для приведенных категорий также не дан полный список возможных символов.
Таблица 15.1. Символы, используемые в регулярных выражениях
Символ • Интерпретация
Категория: escape-последовательности
\b • При использовании его в квадратных скобках соответствует символу "обратная косая черта" с кодом — \u0008
\t • Соответствует символу табуляции \u0009
\r • Соответствует символу возврата каретки \u000D
\n • Соответствует символу новой строки \u000A
\е • Соответствует символу escape \u001B
\40 • Cоответствует символу ASCII, заданному кодом до трех цифр в восьмеричной системе
\х20 • Cоответствует символу ASCII, заданному кодом из двух цифр в шестнадцатиричной системе
\u0020 • Cоответствует символу Unicode, заданному кодом из четырех цифр в шестнадцатиричной системе
Категория: подмножества (классы) символов
. • Соответствует любому символу, за исключением символа конца строки
[aeiou] • Соответствует любому символу из множества, заданного в квадратных скобках
[^аеiоu] • Отрицание. Соответствует любому символу, за исключением символов, заданных в квадратных скобках
[o-9a-fA-F] • Задание диапазона символов, упорядоченных по коду. Так, 0–9 задает любую цифру
\р{name} • Соответствует любому символу, заданному множеству с именем name, например, имя L1 задает множество букв латиницы в нижнем регистре. Поскольку все символы разбиты на подмножества, задаваемые категорией Unicode, то в качестве имени можно задавать имя категории