Умовні підмаски

У PCRE реалізована можливість підпорядковувати шаблон умові чи вибирати із двох умовних підмасок залежно від успіху зіставлення попередньої підмаски. Умовні підмаски мають дві допустимі форми використання:

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

У разі успішного зіставлення умови condition, використовується підмаска yes-pattern, інакше no-pattern (якщо він є). Якщо зазначено більше двох альтернатив, виникне помилка під час компіляції.

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

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

Перша частина відповідає опціональної відкриває дужці, і якщо вона присутня, захоплює її як значення першої підмаски. Наступна частина відповідає одному або більше символам, відмінним від круглої дужки. p align="justify"> Третя частина є умовною підмаскою, що залежить від результату зіставлення першої підмаски. Якщо на початку оброблюваних даних була виявлена ​​кругла дужка, що відкриває, умова буде інтерпретовано як істина, і, отже, для успішного зіставлення третьої частини шаблону необхідна закриває кругла дужка. В іншому випадку, оскільки не вказана друга гілка умовного шаблону, третину буде зіставлено з порожнім рядком. Підсумовуючи все сказане вище, наведений шаблон збігається з послідовністю не-дужок, можливо, укладеної в круглі дужки.

Якщо умовою є рядок (R), воно буде виконано, якщо буде здійснено рекурсивний виклик до шаблону або підмаски. На «найвищому рівні» умова хибна.

Якщо умова не є послідовністю цифр або (R), вона має бути твердженням. Це може бути позитивна або негативна перевірка наступного або попереднього тексту. Розглянемо даний шаблон, що знову містить незначні прогалини, з двома альтернативами на другому рядку:

(?(?=[^a-z]*[a-z])
\d{2}-[a-z]{3}-\d{2}  |  \d{2}-\d{2}-\d{2} )

Наведено приклад із стверджувальною умовою щодо попереднього тексту, яке виконується для необов'язкової послідовності небукв з наступною літерою. Іншими словами, зазначена умова перевіряє наявність хоча б однієї попередньої літери. Якщо літера знайдена, виконується зіставлення з першою альтернативою, інакше - з другою альтернативою. Наведений шаблон відповідає рядкам двох видів: dd-aaa-dd або dd-dd-dd, де aaaa - це букви, а dd - цифри.