Регулярні вирази в javascript
Загальний опис
Регулярні вислови є зразки для пошуку заданих комбінацій символів в текстових рядках (такий пошук називається зіставленням зі зразком). Існує два способи привласнення змінним регулярних виразів, а саме:
Використання ініціалізатор об'єкта: var re = / pattern / switch.
Використання конструктора RegExp: var re = new RegExp ( "pattern" [, "switch"]?).
Тут pattern - регулярний вираз, а switch - необов'язкові опції пошуку.
Ініціалізатор об'єкта, наприклад, var re = / ab + c /. слід застосовувати в тих випадках, коли значення регулярного вираження залишається незмінним під час роботи сценарію. Такі регулярні вирази компілюються в процесі завантаження сценарію і, отже, виконуються швидше.
Виклик конструктора, наприклад, var re = new RegExp ( "ab + c"). слід застосовувати в тих випадках, коли значення змінної буде змінюватися. Якщо ви збираєтеся використовувати регулярний вираз кілька разів, то має сенс скомпілювати його методом compile для більш ефективного пошуку зразків.
При створенні регулярного виразу слід враховувати, що укладення його в лапки тягне за собою необхідність використовувати escape-послідовності, як і в будь-який інший строковою константі. Наприклад, наступні два вирази еквівалентні:
Регулярні вирази використовуються методами exec і test об'єкта RegExp і методами match, replace, search і split об'єкта String. Якщо нам потрібно просто перевірити, чи містить даний рядок підрядок, відповідну зразком, то використовуються методи test або search. Якщо ж нам необхідно витягти підрядок (або підрядка), відповідні зразком, то нам доведеться скористатися методами exec або match. Метод replace забезпечує пошук заданого підрядка і заміни її на інший рядок, а метод split дозволяє розбити рядок на кілька подстрок, грунтуючись на регулярному виразі або звичайною текстовому рядку. Більш докладні відомості про застосування регулярних виразів наведено в описі відповідних методів.
Синтаксис регулярних виразів
Регулярний вираз може складатися зі звичайних символів; в цьому випадку воно буде відповідати заданій комбінації символів в рядку. Наприклад, вираз / ком / відповідає виділеним підрядками в наступних рядках: "грудка", "ласунка", "головком флоту". Однак, гнучкість і міць регулярними виразами надає можливість використання в них спеціальних символів, які перераховані в наступній таблиці.
Спеціальні символи в регулярних виразах:
\ - Для символів, які зазвичай трактуються буквально, означає, що наступний символ є спеціальним. Наприклад, / n / відповідає букві n, а / \ n / відповідає символу перекладу рядка. Для символів, які зазвичай трактуються як спеціальні, означає, що символ повинен розумітися буквально. Наприклад, / ^ / означає початок рядка, а / \ ^ / відповідає просто символу ^. / \\ / відповідає зворотної косої межі \.
^ - Відповідає початку рядка.
$ - Відповідає кінця рядка.
* - Відповідає повторення попереднього символу нуль або більше разів.
+ - Відповідає повторення попереднього символу один або більше разів.
? - Відповідає повторення попереднього символу нуль або один раз.
. - Відповідає будь-якому символу, крім символу нового рядка.
(Pattern) - Відповідає рядку pattern і запам'ятовує знайдене відповідність.
(?: Pattern) - Відповідає рядку pattern, але не запам'ятовує знайдене відповідність. Використовується для угруповання частин зразка, наприклад, / ко (?: Т | шка) / - це короткий запис вираження / кіт | кішка /.
x | y - Відповідає x або y.
- n - невід'ємне число. Відповідає рівно n входженням попереднього символу.
- n - невід'ємне число. Відповідає n або більше входженням попереднього символу. / X / еквівалентно / x + /. / X / еквівалентно / x * /.
- n і m - невід'ємне числа. Відповідає не менше ніж n і не більше ніж m входженням попереднього символу. / X / еквівалентно / x? /.
[Xyz] - Відповідає будь-якому символу з ув'язнених в квадратні дужки.
[^ Xyz] - Відповідає будь-якому символу, крім вкладених у квадратні дужки.
[A-z] - Відповідає будь-якому символу у вказаному діапазоні.
[^ A-z] - Відповідає будь-якому символу, крім лежать в зазначеному діапазоні.
\ B - Відповідає кордоні слова, т. Е. Позиції між словом і пропуском або переведенням рядка.
\ B - Відповідає будь-якій позиції, окрім кордоні слова.
\ СX - Відповідає символу Ctrl + X. Наприклад, / \ cI / еквівалентно / \ t /.
\ D - Відповідає цифрі. Еквівалентно [0-9].
\ D - Відповідає нецифровому символу. Еквівалентно [^ 0-9].
\ F - Відповідає символу перекладу формату (FF).
\ N - Відповідає символу перекладу рядка (LF).
\ R - Відповідає символу повернення каретки (CR).
\ S - Відповідає символу пробілу. Еквівалентно / [\ f \ n \ r \ t \ v] /.
\ S - Відповідає будь-якому непробельний символу. Еквівалентно / [^ \ f \ n \ r \ t \ v] /.
\ T - Відповідає символу табуляції (HT).
\ V - Відповідає символу вертикальної табуляції (VT).
\ W - Відповідає латинської букви, цифри або підкреслення. Еквівалентно / [A-Za-z0-9_] /.
\ W - Відповідає будь-якому символу, крім латинської букви, цифри або підкреслення.
Еквівалентно / [^ A-Za-z0-9_] /.
\ N n - позитивне число. Відповідає n-ної запомненной підрядку. Обчислюється шляхом підрахунку лівих круглих дужок. Якщо лівих дужок до цього символу менше, ніж n, то еквівалентно \ 0n.
\ 0n n - вісімкове число, не більше 377. Відповідає символу з восьмеричним кодом n. Наприклад, / \ 011 / еквівалентно / \ t /.
\ Xn n - шістнадцяткове число, що складається з двох цифр. Відповідає символу з шістнадцятковим кодом n. Наприклад, / \ x31 / еквівалентно / 1 /.
\ Un n - шістнадцяткове число, що складається з чотирьох цифр. Відповідає символу Unicode з шістнадцятковим кодом n. Наприклад, / \ u00A9 / еквівалентно / c /.
Опції пошуку
При створенні регулярного виразу ми можемо вказати додаткових опції пошуку:
i (ignore case). Чи не розрізняти малі та великі літери.
g (global search). Глобальний пошук всіх входжень зразка.
m (multiline). Складний введення повинен розглядатися як кілька рядків. Якщо використовується прапор m, то ^ і $ збігаються на початку і в кінці будь-якого рядка загальної рядки введення, замість початку і кінця всього рядка введення.
Будь-які комбінації цих трьох опцій, наприклад ig або gim.
Тепер розглянемо опцію глобального пошуку. Вона зазвичай застосовується методом replace при пошуку зразка і заміни знайденої підрядка на нову. Справа в тому, що за умовчанням цей метод робить заміну тільки першої знайденої підрядка і повертає отриманий результат. Розглянемо наступний сценарій:
Нарешті, опція багаторядкового пошуку дозволяє проводити зіставлення зі зразком строкового вираження, що складається з декількох рядків тексту, з'єднаних символами розриву рядка. За замовчуванням, зіставлення зі зразком припиняється, якщо знайдений символ розриву рядка. Дана опція долає вказане обмеження і забезпечує пошук зразка по всій заданій стрічці. Вона також впливає на інтерпретацію деяких спеціальних символів в регулярних виразах, а саме: Зазвичай символ ^ зіставляється лише з першим елементом рядка. Якщо ж опція багаторядкового пошуку включена, то він також зіставляється з будь-яким елементом рядка, якому передує символ розриву рядка. Зазвичай символ $ зіставляється тільки з останнім елементом рядка. Якщо ж опція багаторядкового пошуку включена, то він також зіставляється з будь-яким елементом рядка, який є символом розриву рядка.
Запам'ятовування знайдених подстрок
Якщо частина регулярного виразу укладена в круглі дужки, то відповідна їй підрядок буде запам'ятати для подальшого використання. Для доступу до запомненним підрядками використовуються властивості $ 1. $ 9 об'єкта RegExp або елементи масиву, що повертається методами exec і match. В останньому випадку кількість знайдених і запам'ятали подстрок не обмежена.
Наступний сценарій використовує метод replace для перестановки слів в рядку. Для заміни знайденого тексту використовуються властивості $ 1 і $ 2.
Цей сценарій виведе у вікно оглядача текст:
тому \ W = [A-Za-z0-9_] для багатьох браузерів, то українські літери працювати не будуть. Якщо ми хочемо гарантовано використовувати українські літери, то нам прийдеться трошки модифікувати код:
Цей сценарій виведе у вікно оглядача текст:
Регулярні вирази - це потужний засіб для обробки вхідних даних. Завдання, що вимагає заміни або пошуку тексту, може бути красиво вирішена за допомогою цього "мови усередині мови". І хоча максимальний ефект від регулярних виразів можна домогтися при використання серверних мов, все ж не варто недооцінювати можливості цього додатка і на стороні клієнта.
Основні поняття
Регулярний вираз (regular expression) - засіб для обробки рядків або послідовність символів, що визначає шаблон тексту.
Модифікатор - призначений для "інструктування" регулярного виразу.
Метасимволи - спеціальні символи, які служать командами мови регулярних виразів.
Регулярний вираз задається як звичайна змінна, тільки замість лапок використовується слеш, наприклад:
Під найпростішими шаблонами будемо розуміти такі шаблони, які не потребують будь-яких спеціальних символах.
Припустимо, нашим завданням є заміна всіх букв "р" (малих і великих) на латинську велику букву "R" в словосполученні Регулярні вирази.
Створюємо шаблон var reg = / р / і воспользуясь методом replace здійснюємо задумане
В результаті отримаємо рядок 'РегуляRние вираження', заміна відбулася лише на першому входженні букви "р" з урахуванням регістру. Але під умови нашого завдання цей результат не підходить. Тут нам знадобляться модифікатори "g" і "i", які можуть використовуватися як окремо, так і спільно.
Ці модифікатори ставляться в кінці шаблону регулярного виразу, після слеша, і мають таке значення: модифікатор "g" - задає пошук в рядку як "глобальний", тобто в нашому випадку заміна відбудеться для всіх входжень літери "р". Тепер шаблон виглядає так: var reg = / р / g. підставивши його в наш код
отримаємо рядок 'РегуляRние виRаженія'.
Модифікатор "i" - задає пошук в рядку без урахування регістру, додавши цей модифікатор в наш шаблон var reg = / р / gi, після виконання скрипта одержимо шуканий результат нашого завдання - 'RегуляRние виRаженія'.
Спеціальні символи (метасимволи)
Метасимволи задають тип символів шуканого рядка, спосіб оточення шуканої рядка в тексті, а так само кількість символів окремого типу в просматриваемом тексті. Тому метасимволи можна розділити на три групи:
Метасимволи пошуку збігів.
Кількісні метасимволи.
Метасимволи позиціонування.
Метасимволи пошуку збігів
\ B межа слова, задає умову, при якому шаблон повинен виконуватися на початку або кінці слів.
\ B не кордони слова, задає умову, при якому шаблон не виконується на початку або кінці слова.
\ D цифра від 0 до 9.
\ S одиночний порожній символ, відповідає символу пробілу.
\ S одиночний непорожній символ, будь-який один символ за винятком пробілу.
\ W буква, цифра або символ підкреслення.
\ W не буква, цифра або символ підкреслення.
. будь-який символ, будь-які знаки, букви, цифри і т.д.
[] Набір символів, задає умову, при якому шаблон повинен виконуватися при будь-якому збігу символів увязнених в квадратні дужки.
[^] Набір не входять символів, задає умову, при якому шаблон не повинен виконуватися при будь-якому збігу символів увязнених в квадратні дужки.
кількісні метасимволи
* Нуль і більшу кількість разів.
? Нуль або один раз
+ Один і більшу кількість разів.
n або більшу кількість разів.
по крайней мере, n раз, але не більше ніж m разів.
метасимволи позиціонування
^ На початку рядка.
Деякі методи для роботи з шаблонами
replace - даний метод ми вже використали на самому початку статті, він призначений для пошуку зразка і заміни знайденої підрядка на нову підрядок.
test - даний метод перевіряє, чи є збіги в рядку щодо шаблону і повертає false, якщо зіставлення зі зразком закінчилося невдачею, в іншому випадку true.
Також метод test може повертати замість true або false будь-яку іншу рядок задану програмістом.
наприклад:
в цьому випадку в якості результату буде рядок 'Рядок не збіглася'.
exec - даний метод виконує зіставлення рядка із зразком, заданим шаблоном. Якщо зіставлення зі зразком закінчилося невдачею, то повертається значення null. В іншому випадку результатом є масив підрядків, відповідних заданому зразку. / * Перший елемент масиву дорівнюватиме вихідної рядку задовольняє заданим шаблоном * /
наприклад:
в результаті отримаємо чотири рядки:
Дата народження: 15.09.1980
День народження: 15
Місяць народження: 09
Рік народження: 1980
висновок
exec (regexp) - знаходить все збіги (входження в шаблон "регулярки") в рядку. Повертає масив (при збігу) і оновлює властивість regexp-а, або null - якщо нічого не знайдено. З модифікатором g - при кожному виклику цієї функції, вона буде повертати наступне збіг після попереднього знайденого - це реалізовано за допомогою ведення індексу зсуву останнього пошуку.
match (regexp) - знайти частину рядка за шаблоном. Якщо вказано модифікатор g, то функція match () повертає масив всіх збігів або null (а не порожній масив). Без модифікатора g ця функція працює як exec ();
test (regexp) - функція перевіряє рядок на відповідність шаблону. Повертає true - якщо є збіг, і false - якщо збігу немає.
replace (regexp, mix) - метод повертає рядок змінити відповідно до шаблону (регуляррним виразом). Перший параметр regexp також може містити рядок, а не регулярний вираз. Без модифікатора g - метод в рядку замінює тільки перше входження; з модифікатором g - відбувається глобальна заміна, тобто змінюються всі входження в цьому рядку. mix - шаблон заміни, може прінітать значення рядка, шаблону заміни, функції (ім'я функції).
Якщо другий параметр mix містить рядок, то ми можемо використовувати такі спецсимволи:- $$ - вставити $;
- $ - збіглася подстрока;
- $ `- частина рядка перед збіглася підрядка;
- $ '- частина рядка після збіглася підрядка;
- $ N ($ nn) - значення n-ой пам'ятною дужки (якщо перший аргумент - об'єкт RegExp);
Якщо другий параметр mix містить функцію, то вона буде викликана при кожному збігу. Значним для заміни буде результат роботи функції, тобто return '';
Приклади таких функції:
Наступний виклик replace поверне XXzzzz - XX. zzzz.
Як бачите, тут дві дужки в регулярному виразі, і тому в функції два параметри p1, p2. Якби були три дужки, то в функцію довелося б додати параметр p3.
Наступна функція замінює слова типу borderTop на border-top:
клас RegExp
Цей клас відповідає за обробку рядків за допомогою регелярних виразів. Його конструктор має наступний вигляд:
Він приймає тільки один обов'язковий пареметр - це "Регулярний вираз", яке полягає в лапки. Параметр "прапори" представляє собою додаткові умови пошуку і може приймати значення:
- g - задається глобальний пошук, якщо цей прапор встановлений, то вираз поверне всі підходящі слова.
- i - ігнорування регістра символів
- m - багаторядковий пошук
Для роботи з регулярними вараженіямі використовуються три методи класу String:
- match - виконує пошук в рядку, використовуючи регулярний вираз, передане в якості параметра і повертає масив з результатами пошуку. Якщо нічого не знайдено, повертається null.
- replace - виконує пошук і заміну в рядку, використовуючи регулярні вирази, і повертає отриманий рядок.
- search - виконує поіка в рядку, використовуючи регулярний вираз, передане в якості параметра, і повертає позицію першого підрядка, що збігається з регулярним виразом.