Яблуко червонеі зелене яблуко і ще одне червоне яблуко і ще одне яблуко, зелене
Проте пошук по всьому регулярному виразу дасть всього 2 результати, тому як в останніх випадках умови основного регулярного вираження не виконуються:
яблуко червоне ізелене яблуко і ще одне червоне яблуко і ще одне яблуко, зелене
Необхідно відмітити, що для цих двох випадків буде повернений не лише результат пошуку по основному регулярному виразу, але і результат пошуку по внутрішньому регулярному виразу для кожного із знайдених фрагментів. В більшості випадків це корисно (приклад - трохи пізніше), але інколи навпаки, краще позбавитися від зайвих результатів. В цьому випадку необхідно додати символи '?:' безпосередньо після круглої дужки, що відкривається: /(?:червоне|зелене) яблоко/.
Тепер приклад, коли здобуття результатів внутрішніх регулярних виразів може бути корисним. Допустимо, нам необхідно перевірити, чи є рядок семизначним телефонним номером з вказівкою коду міста і отримати з неї код міста і номер телефону:
/\((\d{3,5})\)\s+(\d{3}-\d{2}-\d{2})/
Давайте розглянемо цей регулярний вираз детальніше.
Перша кругла дужка тут втрачає своє спеціальне значення і розглядатиметься як звичайний символ:\(
Далі йде регулярний вираз в дужках (перевірка коду міста):(\d{3,5})
Після цього йде закриваюча кругла дужка, яка також позбавлена свого спеціального значення із-за символу зворотного слешу, що стоїть перед нею:\)
Потім йде пропуск порожнього місця:\s+
І ще один регулярне вираз в дужках, який перевіряє номер телефону:(\d{3}-\d{2}-\d{2})
Як бачите, тут є 3 регулярні вирази - основний і два внутрішніх. При цьому основний вираз дозволяє нам перевірити, чи має рядок необхідний нам формат, а два внутрішніх - отримати відповідно код міста і номер телефону.
Поглянемо, як працює цей регулярний вираз. Хай у нас є рядок: "My phone is (095) 123-45-67". Результатами пошуку будуть 3 рядки: '(095) 123-45-67', '095' і '123-45-67'.
Нам залишилося розглянути ще одну групу метасимволів, що визначають кількісні показники (т.з. quantifiers). Як ви вже могли відмітити раніше - дуже часто буває необхідно вказати, що якийсь символ повинен повторюватися певну кількість разів. Звичайно, можна просто вказати його необхідну кількість разів безпосередньо в рядку, але це, природно не вихід. Тим паче, що дуже часто зустрічаються ситуації, коли точна кількість символів невідома. Тому синтаксис регулярних виразів містить набір метасимволів, призначених саме для вирішення подібних завдань. Кожен з описаних нижче метасимволів визначає кількісну характеристику символу який знаходиться безпосередньо перед ним.
Зірочка '*'. Вказує, що символ має бути повторений 0 або більше разів (тобто символ може бути відсутнім або бути присутнім в будь-яких кількостях). Приклад: виразу /ab*c/ знайде рядки 'ас', 'abc', 'abbc' і так далі
Плюс '+'. Вказує, що символ має бути повторений 1 або більше разів (тобто символ зобов'язаний бути присутнім і може бути присутнім в будь-яких кількостях). Приклад: виразу /ab+c/ знайде рядки 'abc', 'abbc', 'abbbc' і так далі, але не знайде рядок 'ас'.
Знак питання '?'. Вказує, що символ має як бути присутнім, так і немає, але при цьому не може повторюватися більше одного разу. Приклад: виразу /ab?c/ знайде рядки 'ас' і 'abc', але не знайде рядок 'abbc'.
Фігурні дужки '{' і '}'. Визначають кількісну характеристику символу. Усередині дужок через кому перераховуються мінімальна і максимальна кількість повторень символу. При цьому будь-який з параметрів може бути опущений, а крім того можна задати точну кількість повторень, вказавши лише одне число. Приклади:
{2,4} - символ повинен повторитися мінімум 2 рази, але не більше 4.
{,5} - символ може бути відсутнім (оскільки не задана мінімальна кількість повторень), але якщо присутній, то не повинен повторюватися більше 5 разів.
{3,} - символ повинен повторюватися мінімум 3 рази, але може бути і більше.
{4} - символ повинен повторюватися рівно 4 рази
Є ще одна тонкість у використанні метасимволу '?'. Поглянете на такий вираз: /.+a/. Очікується, що воно поверне нам частину тексту до першого входження символу 'a' в цей текст. Насправді воно працюватиме трохи не так, як очікується і результатом пошуку буде весь текст до останнього входження символу 'a'. Річ у тому, що за умовчанням кількісні метасимволи "скупилися" і намагаються захопити як можна більший шматок тексту. Якщо це не потрібно (як в нашому випадку), то необхідно "відучити" їх від жадності, вказавши знак '?' після кількісного метасимволу: /.+?a/. Після цього вираз працюватиме так як потрібно.
Дата добавления: 2016-04-02; просмотров: 564;