Підмаски
Підмаски обмежуються круглими дужками, які можуть бути вкладеними. Використання частини шаблону як підмаски має такі функції:
-
Локалізує набір альтернатив. Наприклад, шаблон
cat(aract|erpillar|)
відповідає одному зі слів "cat", "cataract" або "caterpillar". Без використання дужок він відповідав би рядкам cataract, erpillar або порожньому рядку. -
Вказує на необхідність захоплення підрядка (як показано вище). У тому випадку, якщо відповідність шаблону було знайдено, підрядок, що відповідає підмаску, також передається назад, що викликає за допомогою аргументу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.