В объектной модели .NET присутствует еще один компонент - объект Capture, который мы еще не рассматривали. Одни считают, что он открывает новые возможности работы с результатами поиска, другие - что объект Capture только зря загромождает программу.
Компания Microsoft включила в пакет регулярных выражений интересный и оригинальный инструмент для поиска сбалансированных конструкций (стоит напомнить, что эта задача не решается при помощи традиционных регулярных выражений).
.NET позволяет инкапсулировать объекты Regex в сборках. Такая возможность может пригодиться для создания библиотеки регулярных выражений. Пример, приведенный в следующей врезке, показывает, как это делается.
Необходимость строить и сохранять отдельный объект Regex для каждого регулярного выражения, встречающегося в программе, привела бы к чрезмерному загромождению программ. К счастью, в .NET применяется кэширование регулярных выражений.
Как упоминалось в разделе «Основные принципы работы с регулярными выражениями» на с. 434, иногда можно обойтись без явного создания объектов Regex. Следующие статические функции позволяют напрямую применять регулярные выражения к тексту:
Объект Group содержит информацию о совпадении одной пары сохраняющих круглых скобок (или для группы с нулевым номером - обо всем совпадении). Ниже перечислены свойства и методы объекта Group.
Если регулярное выражение содержит сохраняющие круглые скобки любого типа, в массив обычно включаются дополнительные элементы, представляющие сохраненный текст (о том, когда это не происходит, рассказано ниже).
Прежде чем углубляться в детали, рассмотрим общую структуру объектной модели регулярных выражений .NET. Объектная модель представляет собой совокупность классов, через которую пользователь получает доступ к функциональности регулярных выражений.
Регулярные выражения .NET обладают богатыми возможностями, они логичны, а для работы с ними предусмотрен полный и удобный интерфейс. Программисты Microsoft отлично справились с созданием пакета, но с документацией все наоборот - она просто ужасна.
ECMAScript - стандартизированная версия JavaScript, обладающая собственной семантикой разбора и применения регулярных выражений. Регулярные выражения .NET, созданные с параметром RegexOptions.ECMAScript, пытаются имитировать эту семантику.
Символ \, за которым следует цифра, может интерпретироваться либо как число в восьмеричной записи, либо как обратная ссылка. Выбор и правила интерпретации зависят от того, был ли задан параметр RegexOptions.ECMAScript.
Концепция «обратного» поиска (то есть поиска справа налево, а не слева направо) давно будоражила умы разработчиков регулярных выражений. Возможно, самые большие трудности связаны с определением того, что же понимается под поиском «справа налево».
В предыдущих главах под термином «компиляция» понимались операция, выполняемая перед применением регулярного выражения, в ходе которой система проверяет синтаксис выражения и преобразует его во внутреннюю форму, пригодную для применения к тексту.
Часть if условной конструкции [(?if then | else)] (с. 161) может содержать любые разновидности позиционных проверок, а также ссылки на сохраняющие группы (по имени или порядковому номеру). Простой текст (или простое регулярное выражение) в этой части автоматически интерпретируется как позитивная опережающая проверка (то есть неявно заключается в [(?=...)]).
Смешивать в выражении обычные сохраняющие круглые скобки с именованными сохранениями не рекомендуется. Если вы все же поступите подобным образом, необходимо учитывать некоторые важные последствия способа нумерации сохраняющих конструкций.
.NET поддерживает возможность именованного сохранения (с. 160) в конструкциях [(?‹имя›...)] и [(?'имя'...)]. Два варианта синтаксиса эквивалентны; вы можете использовать любой из них, однако я предпочитаю вариант с ‹...› - мне кажется, что он получит более широкое распространение.
Поддержка регулярных выражений в .NET использует традиционный механизм НКА, поэтому к ней в полной мере применимы сведения, изложенные в главах 4, 5 и 6. В табл. 9.1 приведена краткая сводка диалекта регулярных выражений .NET. Большинство перечисленных конструкций рассматривается в главе 3.
Платформа Microsoft .NET Framework, используемая в Visual Basic, C# и С++ (а также в других языках), содержит общую библиотеку регулярных выражений, обеспечивающую единую семантику операций с регулярными выражениями в разных языках.
Помимо основного метода compile( ), класс Pattern содержит ряд вспомогательных функций и методов, которые не обладают новыми возможностями, но упрощают доступ к существующей функциональности.