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

Мета-символ \b означает границу слова (word boundary). Он сообщает matcher'у, что совпадение (match) должно генерироваться только в случае, если цифра (\d) находится на границе слова, то есть между символом типа \w и символом типа \W. В свою очередь, часто используемые в шаблонах мета-символы \w и \W означают следующее: \w — принадлежность множеству, которое в математической нотации записывается как { буквы, символ подчеркивания }, \W — дополнение множества \w, то есть все остальные символы.

Для знакомства с правилами образования шаблонов полезно рассмотреть несколько таблиц, которые содержат краткие описания условных обозначений, используемых в процессе образования выражений.

Символ

Соответствует

Символ

Соответствует

\d

Цифре. Эквивалентно шаблону [0-9]

\D

Не цифре

\w

Любой букве или символу _ (подчеркивания)

\W

Любой не букве и не символу _

\s

Любому пустому символу (whitespace)

\S

Любому непустому символу

. (точка)

Любому символу, кроме символа "возврат каретки" ('\n')

\.

Символу '.' (точка)

literals

Символы, отличные от  $ . ^ { [ ( | ) * + ? \ соответствуют самим себе

\

Признак служебного символа. Например, escape-последовательность "\\" соответствует "\", а "\(" соответствует "(".

Кроме этих символов в тайнописи Regex часто используются повторители (quantifiers).

Quantifier

Соответствует

*

Нуль или более вхождений предшествующего символа (или шаблона)

+

Одно или более вхождений предшествующего шаблона

?

Нуль или одно вхождение предшествующего шаблона

{n}

n вхождений шаблона

{n,}

n или более вхождений шаблона

{n,m}

От n до m (включительно) вхождений шаблона

Заметим, что часто используемая escape-последовательность \s (пустые, или whitespace-символы) эквивалентна множеству [ \f\n\r\t\v].

Итак, множество w — это { буквы, символ подчеркивания }. Шаблону \w+ соответствуют все слова, образованные из букв, включая подчеркивание, или строки текста, образованные из одного или более символов, принадлежащих множеству w.

Шаблону zo* соответствуют cлова: z, zo, zoo, zooo, ..., и это вполне понятно. Может быть не сразу ясно, что метод Match найдет соответствие этому шаблону и в других строках текста, например: oz, zulu, zigzag, но он не найдет его в словах: ZOO, OZ, и т. д. Дело в том, что шаблон zo* требует вхождения символа z, но не требует вхождения символа o.

Суть шаблона можно выразить в словесной форме: "есть буква z, и могут быть буквы o". Вы можете считать, что приблизились к пониманию особенностей использования повторителей, если правильно ответите на вопрос. Что выведет следующий фрагмент?

text = "oz";

pattern = "zo*";  // Смысл шаблона: есть буква z, и могут быть буквы o

Regex ex = new Regex (pattern);

if (ex.IsMatch (text))

Console.WriteLine ("There are " + ex.Matches(text).Count + " matches");

else

Console.WriteLine ("No matches");

foreach (Match m in ex.Matches(text))

Console.WriteLine ("'" + m + "'");

Он выведет сообщение об одном найденном совпадении и строку 'z', так как в тестируемой строке нашлось одно вхождение z, которое удовлетворяет шаблону (pattern). Обрамление '' из апострофов позволяет увидеть пробелы и другие whitespace-символы (табуляции, конец страницы, и т. д.). Поясним на примерах смысл других типов повторителей.

¨  Шаблону z+ удовлетворяют строки: z, glukoza, bizzz, то есть все слова, где есть хоть одна буква z.

¨  Шаблону a?ve? удовлетворяют строки: never, vain, v, veer, Antananarivo, то есть все слова, где есть хоть одна буква v, так как другие символы не обязательны.

¨  Шаблонам o{2} и o{2,} удовлетворяют строки: zoo, gooogle, но не удвлетворяют: polo, monoatomic.