Декілька простих прикладів.
Regexp | Коментарі |
/\d\d\d/ | Будь-яке тризначне число ('123', '719', '001') |
/\w\s\d\d/ | Буква, пропуск (або табуляція) і двозначне число ('A 01', 'z 45', 'S 18') |
/\d and \d/ | Будь-який з наступних рядків: '1 and 2', '9 and 5', '3 and 4'. |
Синтаксис регулярних виразів має засоби для визначення власних підмножин символів. Наприклад вам може знадобитися задати умову, що в цьому місці рядка повинна знаходитися шістнадцяткова цифра або ще щось подібне. Для опису таких підмножин застосовуються символи квадратних дужок '[]'. Квадратні дужки, зустрінуті всередині регулярного виразу вважаються одним символом, який може набувати значень, перерахованих всередині цих дужок.
Є невелика тонкість в тому, як працюють метасимволи всередині квадратних дужок. Річ у тому, що в синтаксисі регулярних виразів існує ще безліч метасимволів, але практично всі вони працюють лише поза секціями описів підмножин. Єдині метасимволи, які працюють усередині цих секцій це:
Зворотний слеш ('\'). Тобто всі метасимволи з приведеної раніше таблиці працюватимуть.
Мінус ('-'). Використовується для завдання набору символів з одного проміжку (наприклад всі цифри можуть бути задані як '0-9')
Символ '^'. Якщо цей символ стоїть першим в секції задання підмножини символів (і лише в цьому випадку!) він розглядатиметься як символ заперечення. Тобто можна задати всі символи, які не описані в даній секції.
Декілька прикладів:
Regexp | Коментарі |
[0-9A-Fa-f] | Цифра в шістнадцятковій системі числення |
[\dA-Fa-f] | Те ж саме, але з використанням метасимвола |
[02468] | Парна цифра |
[\^d] | Все, окрім цифр (аналог метасимвола \D) |
[a^b] | Будь-який з символів 'a', 'b', '^'. Відмітьте, що тут символ '^' не має якого-небудь спеціального значення, тому що стоїть не на першій позиції усередині квадратних дужок. |
Тепер необхідно розглянути ще декілька метасимволів. Як вже було сказано раніше, всі вони працюють лише поза секціями описів підмножин символів (поза квадратними дужками).
Символи '^' і '{$}'. Вони використовуються для того, що того, аби вказати парсеру регулярних виразів на те, аби він звернув увагу на положення шуканого тексту в рядку. Символ '^' вказує, що шуканий текст повинен знаходитися на початку рядка, символ '{$}' навпаки, вказує, що шуканий текст повинен знаходитися в кінці рядка. Поглянемо, як це працює на прикладі:
Допустимо, у нас є текст:
12 aaa bbb
aaa 27 ccc
aaa aaa 45
І регулярний вираз для пошуку чисел в цьому тексті: /\d\d/m (не звертає уваги доки на модифікатор). Пошук по цьому регулярному виразу поверне нам 3 значення: '12', '27', '45'. Тепер обмежимо пошук, вказавши, де саме усередині рядка повинен розташовуватися текст: /^\d\d/m. Тут результат буде лише один - '12', тому що лише це число розташовується на початку рядка. Аналогічно, регулярний вираз /\d\d$/m поверне результат '45'.
Символ точки '.'. Цей метасимвол вказує, що на даному місці в рядку може знаходитися будь-який символ (за винятком символу перекладу рядка). Дуже зручно використовувати його, якщо вам потрібно "пропустити" яку-небудь букву в слові при перевірці. Наприклад регулярний вираз /.bc/ знайде в тексті і 'abc' і 'Abc' і 'Zbc' і '5bc'.
Символ вертикальної риски '|'. Використовується для завдання списку альтернатив. Наприклад регулярний вираз:
/(червоне|зелене) яблуко/
Знайде в тексті всі словосполуки 'червоне яблуко' і 'зелене яблуко'.
Символи круглих дужок '(' і ')'. Ці символи дозволяють отримати з шуканого рядка додаткову інформацію. Зазвичай, якщо парсер регулярних виразів шукає в тексті інформацію по заданому виразу і знаходить її - він просто повертає знайдений рядок. Проте, якщо він зустрічає усередині регулярного виразу круглі дужки, то він розглядає вміст цих дужок як ще одне регулярне вираження, по якому необхідно провести пошук. Парсер рекурсивно викликає сам себе для пошуку по новому регулярному виразу і використовує результати пошуку для подальшої обробки основного регулярного вираження. При цьому, якщо пошук хоч би по одному з внутрішніх регулярних виразів не увінчався успіхом - пошук по всьому регулярному виразу вважається безуспішним.
Розглянемо як приклад те, як працює парсер регулярних виразів в разі приведеного вище регулярного виразу про яблука: /(червоне зелене) яблуко/.
- Парсер починає розбір регулярного виразу і зустрічає вираз в дужках: (червоне|зелене)
- Парсер викликає себе для пошуку по знайденому регулярному виразу.
- Отримавши результати пошуку парсер підставляє по черзі кожен з отриманих результатів на місце виразу в дужках і дивиться, чи задовольняє знайдений результат всім умовам основного регулярного виразу (в даному випадку дивиться, чи є після знайденого слова слово "яблуко").
- Якщо все гаразд - результати пошуку по кожному з наявних регулярних виразів для цього випадку повертаються, якщо немає - парсер просто переходить до наступного знайденого фрагменту. Результат пошуку внутрішнього регулярного виразу для цього фрагменту при цьому втрачається.
Як приклад візьмемо рядок:
яблуко червоне і зелене яблуко і ще одне червоне
яблуко і ще одне яблуко, зелене
Пошук по внутрішньому регулярному виразу дасть 4 результати (виділені жирним шрифтом):
Дата добавления: 2016-04-02; просмотров: 512;