Умовні підмаски
У 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 - цифри.