Підмаски

Підмаски обмежуються круглими дужками, які можуть бути вкладеними. Використання частини шаблону як підмаски має такі функції:

  1. Локалізує набір альтернатив. Наприклад, шаблонcat(aract|erpillar|)відповідає одному зі слів "cat", "cataract" або "caterpillar". Без використання дужок він відповідав би рядкам cataract, erpillar або порожньому рядку.

  2. Вказує на необхідність захоплення підрядка (як показано вище). У тому випадку, якщо відповідність шаблону було знайдено, підрядок, що відповідає підмаску, також передається назад, що викликає за допомогою аргументуovector функції pcre_exec(). Круглі дужки, що відкривають, нумеруються зліва направо (починаючи з одиниці) і їх порядкові номери використовуються для нумерації відповідних підрядок в результаті.

Наприклад, якщо рядок the red king зіставляється з шаблоном the ((red|white) (king|queen)), будуть захоплені підрядки «red king», «red» та «king», з номерами 1, 2 та 3 відповідно.

У реальному житті виконання одночасно двох функцій може виявитися незручним. Трапляються випадки, коли необхідне угруповання альтернатив без захоплення рядка. Якщо після відкриття круглої дужки слід «?:», захоплення рядка не відбувається, і поточна підмаска не нумерується. Наприклад, якщо рядок the white queen зіставляється з шаблоном the ((?:red|white) (king|queen)), будуть захоплені підрядки "white queen" і "queen", і вони будуть пронумеровані 1 і 2 відповідно. Максимальна кількість захоплюючих підмасок — 65535. Такі великі шаблони можуть не скомпілюватися, залежно від налаштувань libpcre.

Якщо в незахоплюючій підмасці необхідно вказати додаткові опції, можна скористатися зручним скороченням: символ, що позначає опцію, що встановлюється, поміщається між «?» та «:». Таким чином, наступні два шаблони

(?i:saturday|sunday)
(?:(?i)saturday|sunday)

відповідають тому самому набору рядків. Оскільки альтернативні версії беруться ліворуч, і встановлені опції зберігають свою дію до кінця підмаски, опція, встановлена ​​в одній гілці, також має ефект у всіх наступних гілках. Тому наведені вище шаблони збігаються як з SUNDAY, так і з Saturday.

Також можна використовувати іменовані підмаски за допомогою синтаксису (?P<name>pattern). Ця підмаска буде індексована в масиві збігів, крім звичайного числового індексу, ще й на ім'я name. Також існують два альтернативні синтаксиси: (?<name>pattern)и(?'name'pattern)

Іноді буває необхідно мати кілька збігів, що виключають одне одного. Зазвичай кожен такий збіг отримує свій власний номер, навіть якщо шаблон дозволяє збігтися тільки одному з них. Синтаксис (?| дозволяє обійти цю поведінку і прибрати номери, що дублюються. Розглянемо наступне регулярне вираз, зіставлене з рядком Sunday :

(?:(Sat)ur|(Sun))day

Тут Sun зберігається на посиланні 2, тоді як посилання 1 порожня. В результаті зіставлення Saturday у зворотному посиланні 1 з'являється Sat, в той час як посилання 2 не існує. Використання (?| у шаблоні вирішує цю проблему:

(?|(Sat)ur|(Sun))day

У цьому шаблоні обидві підмаски SunиSat буде збережено під номером 1.