Правильные (Regular) выражения и класс Regex. Операторы над компонентами регулярных выражений, страница 3

¨  Шаблону o{1,3} удовлетворяют строки: no, coo, goooooooooogle.

¨  Шаблон o{1,} эквивалентен o+, шаблон o{0,} эквивалентен o*, шаблон o{0,1} эквивалентен o?.

В документе по ASP.NET быыло использовано регулярное выражение ValidationExpression=".+@.+\..+" для проверки правильности ввода адреса email. Попытаемся расшифровать его по частям. Часть ".+" задает шаблон, которому удовлетворяют последовательности из одного или более символов. Части "@" соответствует символ @. Далее, повторяется первая часть ".+", затем символ точка "\." и, наконец, снова последовательность из одного или более символов.

Как вы догадались, проверка адреса таким шаблоном будет весьма грубой, она пропустит всякие глупости. Поэтому, можно попытаться создать более строгий шаблон: "\w+@\w+\.\w+". Здесь, часть ".+" заменена на "\w+" (строка из одной или более букв). Но и этот шаблон не точен. Придумайте примеры неправильных адресов, которые он пропустит. Для того, чтобы создать более точный шаблон, необходимо узнать еще несколько трюков технологии Regex.

Операторы над компонентами регулярных выражений

Следующая таблица завершает список правил, по которым строятся шаблоны правильных выражений. Note. Microsoft-расширение технологии регулярных выражений имеет еще ряд операторов. Некоторые из них мы рассмотрим позже, а некоторые вы найдете в MSDN.

Оператор

Описание

x|y

Проверяет на соответствие x или y. Например, "л|новка" соответствуют все строки, содержащие "л", а также строки, содержащие "новка" (циновка, обновка). Шаблону "(л|н)овка" соответствуют строки: "Обновка", "Уловка".

[xyz]

Проверяет на соответствие множеству символов [xyz]. Например, шаблону "[!?]" соответствуют все строки, содержащие вопросительные или воклицательные знаки.

[^xyz]

Будут обнаружены все подстроки, не входящие в множество [xyz].

[a-z]

Задает диапазон символов. Например, шаблону "[a-c]" соответствуют все строки, содержащие 'a', 'b' или 'c'.

[^a-z]

Задает множество символов, не принадлежащих диапазону. Например, шаблону "[^a-y]" соответствуют строки: "oz", "..o", "words ", но не соответствуют строки "some", "other", "words".

(pattern)

Проверяет на соответствие pattern и запоминает это соответствие как группу (объект типа Group) с порядковым номером. Далее на этот объект можно ссылаться. Для проверки на соответствие скобкам используйте "\(" или "\)".

\num

Ссылка на запомненную группу номер num., Например, @"(.)\1" ищет сдвоенные (или более) символы.

^

Запрет пробелов и других пустых символов в начале строки.

$

Запрет пробелов и других пустых символов в конце строки.

Последние две строки таблицы содержат операторы ^ и $, которые заставляют ядро matcher'а оценить совпадение всей строки и не реагировать на частичные совпадения подстрок. Оператор | выполняет роль логической операции ИЛИ. Например, шаблон "Hi, (John|Jane)" выдаст совпадение на как на подстроку "Hi, John", так и на подстроку "Hi, Jane".

Используя таблицу, вы без труда поймете, что следующая строка является приближением к шаблону, который будет более надежно работать при проверке адреса электронной почты:

pattern = @"\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*";

Рассмотрим только одну часть "([-+.]\w+)*" этого шаблона. Она говорит о том, что:

¨  [-+.] испытуемая строка может иметь один или более символов - (hyphen — дефис) или одну точку,

¨  \w+ строка должна иметь по крайней мере один символ из множества w.

Остальные части шаблона вы расшифруете самостоятельно. Этот шаблон пропустит, то есть будет считать правильным, следующий адрес:

text = "some-one@example.company.com";