Условные подшаблоны

Наверх  Предыдущий  Следующий

Можно управлять процессом сравнения подшаблона, таким образом, чтобы он сравнивался только при выполнении условия, либо задать два альтернативных подшаблона, которые будут выбираться в зависимости от выполнения либо невыполнения условия или от успешности сравнения предыдущего подшаблона захватывающего подстроки. Существуют две возможные формы условного подшаблона

(?(condition)yes-pattern)

(?(condition)yes-pattern|no-pattern)

Если условие (condition) выполнено, то используется "yes-pattern", в противном случае используется "no-pattern" (если присутствует). Если указано более двух альтернатив, то компиляция шаблона завершается с ошибкой.

 

Существует два вида условий. Если текст между скобками состоит из последовательности цифр, то условие будет выполнено, если совпала захваченная подстрока с таким порядковым номером. Рассмотрим следующий шаблон, содержащий не значащие "пробельные" символы (опция PCRE_EXTENDED установлена), чтобы сделать его более читабельным и разделить на три части для удобства обсуждения:

( \( )?    [^()]+    (?(1) \) )

Первая часть совпадет с опциональной открывающейся скобкой, и, если она присутствует, то будет выступать в качестве первой захваченной подстроки. Вторая часть совпадет с одним или более символом, не являющимся скобками. Третья часть - это условный подшаблон который проверяет было ли совпадение в первом подшаблоне. Если совпадение было, то есть исходная строка начинается с открывающейся скобки, то условие будет выполнено и будет использован "yes-pattern" и, значит, нужна закрывающаяся скобка. В противном случае, так как "no-pattern" отсутствует, подшаблон совпадет с пустой строкой. Другими словами, шаблон требует последовательность любых символов, кроме скобок, которая опционально может быть заключена в скобки.

 

Если условие (condition) не является последовательностью цифр, то оно должно быть утверждением. Это может также быть позитивное или негативное впередсмотрящее или назадсмотрящее утверждение. Рассмотрим шаблон, который снова содержит незначащие "пробельные" символы и содержащий две альтернативы на второй строчке:

(?(?=[^a-z]*[a-z])

\d{2}[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

Условие является позитивным впередсмотрящим утверждением, которое совпадает с опциональной последовательность не-букв, за которой следует буква. Другими словами, проверяется наличие хотя бы одной буквы. Если буква найдена, рассматривается первая ветвь альтернатив, в противном случае - вторая. Этот шаблон совпадает со строками в одной из двух форм: "dd-aaa-dd" или "dd-dd-dd", где "aaa" - это буквы, а "dd" - это цифры.