Учебник по основам PHP. PHPBeginner


Синтаксис регулярных выражений - часть 8


В претензиях возможно указывать альтернативы и все то, что может использоваться в обычных шаблонах, кроме повторений. Для претензий предшествия альтернативы не должны иметь неопределенную длину, например, следующая претензия допустима: (?<lа[bс), в то время как недопустимы: (?<!а(а be)) и (?<lа?|bс).

Допустимо использовать последовательности претензий, например (?<=\d{3}) (?<!000)\w соответствует слову, которому предшествуют три цифры, не являющиеся одновременно нулями. Таким образом, можно производить многочисленные проверки одного места совпадения.

Также возможны вложения, например (?<=(?<!вв)ББ)аа будет соответствовать фрагменту «ББаа», но не «ввББаа». На подшаблоны претензий ссылки не указываются.

Специальные структуры подшаблонов

Присутствие в шаблоне множества неопределенных числителей усложняет обработку регулярных выражений (в особенности, когда обрабатываемый текст велик) и увеличивает время обработки. Указание модификаторов «жадности» не позволяет избавиться от этого, так как все равно перебираются все возможные комбинации повторений, прежде чем возвратится результат обработки.

Поэтому в подшаблонах возможно использовать последовательности, блокирующие дальнейший перебор повторений подшаблона после того, как уже было найдено первое соответствие фрагменту текста. Такие подшаблоны маркируются последовательностью после открывающей скобки. Модификаторы «жадности» сохраняют при этом свое значение. Иными словами, вместо того, чтобы семь раз отмерять, мы сразу нарезаем строку на фрагменты.

Использование этого метода накладывает на выражение то ограничение, что после того, как найдено совпадение подшаблона с фрагментом текста, все дальнейшие проверки проводятся относительно этого места совпадения, поэтому здесь обоснованно использование сложных претензий. Не стоит забывать, что при этом (это и достоинство, и недостаток этого метода), если найдено совпадение с таким подшаблоном, но в целом шаблон не соответствует фрагменту, то поиск завершается неудачей, хотя, возможно, при обычном поиске совпадение с шаблоном могло бы быть найдено в другом месте текста (другом возможном значении числителя).




Начало  Назад  Вперед