Условные подмаски
В PCRE реализована возможность подчинять шаблон условию либо выбирать
из двух условных подмасок в зависимости от успеха сопоставления
предыдущей подмаски. Условные подмаски имеют две допустимые формы
использования:
В случае успешного сопоставления условия condition, используется
подмаска yes-pattern, в противном случае no-pattern
(если он присутствует). Если указано более двух альтернатив,
возникнет ошибка во время компиляции.
Условия бывают двух видов. Если между скобками
заключены цифры, условие будет выполняться в том случае,
если подмаска с соответствующим номером была успешно сопоставлена.
Рассмотрим следующий шаблон (он содержит незначащий пробел для удобства
чтения, подразумевается использование модификатора
PCRE_EXTENDED),
разделив его для удобства на три смысловые части:
Первая часть соответствует опциональной открывающей скобке,
и в случае если она присутствует, захватывает её как значение
первой подмаски. Следующая часть соответствует одному или более
символам, отличным от круглой скобки. Третья часть является условной
подмаской, зависящей от результата сопоставления первой подмаски.
Если в начале обрабатываемых данных была обнаружена
открывающая круглая скобка, условие будет интерпретировано как
истина, и, следовательно, для успешного сопоставления третьей
части шаблона необходима закрывающая круглая скобка. В противном случае,
поскольку не указана вторая ветвь условного шаблона, третья часть
будет сопоставлена с пустой строкой. Суммируя все вышесказанное,
приведённый шаблон совпадает с последовательностью не-скобок,
возможно, заключённой в круглые скобки.
Если условием является строка (R)
, оно будет
выполнено, если будет произведён рекурсивный вызов к шаблону или
подмаске. На «самом верхнем уровне» условие ложно.
Если условие не является последовательностью цифр или (R),
оно должно быть утверждением. Это может быть либо положительная
или отрицательная проверка последующего либо предыдущего текста.
Рассмотрим данный шаблон, снова содержащий незначащие пробелы,
с двумя альтернативами на второй строке:
Приведён пример с утверждающим условием касательно предшествующего
текста, которое выполняется для необязательной последовательности
не-букв с последующей буквой. Говоря другими словами, указанное
условие проверяет наличие хотя бы одной предшествующей буквы.
Если буква найдена, выполняется сопоставление с первой
альтернативой, в противном случае — со второй альтернативой.
Приведённый шаблон соответствует строкам двух видов:
dd-aaa-dd либо dd-dd-dd, где aaaa — это буквы, а dd — цифры.