Регулярні вирази в JavaScript

Матеріал з Вікі ЦДУ
Перейти до: навігація, пошук

Регулярні вирази - це формальна мова пошуку і здійснення маніпуляцій з підрядка в тексті, заснований на використанні метасимволів (символів-джокерів, англ. Wildcard characters). По суті це рядок-зразок, що складається з символів і метасимволів і задає правило пошуку.
Регулярні вирази використовуються деякими текстовими редакторами та допоміжних інструментах для пошуку та підстановки тексту. Наприклад, за допомогою регулярних виразів можна задати шаблони, що дозволяють:

  • Знайти всі послідовності символів «коробка» у будь-якому контексті, як то: «коробка», «король»;
  • Знайти окремо слово «кіт» і замінити його на «кішка»;
  • Знайти слово «кіт», якому передує слово «персидський» або «чеширский»;
  • Прибрати з тексту всі пропозиції, в яких згадується слово кіт або кішка.

Регулярні вирази дозволяють задавати і набагато більш складні шаблони пошуку або заміни.

Об'єкт RegExp

Створення

/ / Повна форма запису
var expr = new RegExp(pattern [, flags]);
/ / Скорочена форма запису (літеральний формат)
var expr = /pattern/flags;

Аргументи
pattern - шаблон пошуку (текст регулярного виразу).
flags - способи пошуку за шаблонами:

  • G - глобальний пошук (обробляються всі збіги з шаблоном пошуку);
  • I - не розрізняти рядкові і заголовні букви;
  • M - багаторядковий пошук.

Порядок вказівки прапорів не має значення.
Опис, приклади
Коли регулярний вираз створюється за допомогою конструктора new RegExp (...), необхідно пам'ятати, що зворотні слеш (\) повинні екранувати, наприклад:

 varexpr = newRegExp('\\w', 'ig');

При використанні літерального формату, цього робити не потрібно:

var expr = /\w/gi;

Обидві запису еквівалентні. Перший варіант може знадобиться, якщо вам доведеться генерувати регулярне динамічно.
Регулярні вирази використовуються методами exec і test об'єкта RegExp і методами match, replace, search і split об'єкта String. Якщо нам потрібно просто перевірити, чи містить даний рядок підрядок, відповідну зразком, то використовуються методи test або search. Якщо ж нам необхідно витягти підрядок (або підрядка), відповідні зразком, то нам доведеться скористатися методами exec або match. Метод replace забезпечує пошук заданої підрядка і заміни її на інший рядок, а метод split дозволяє розбити рядок на кілька підрядка, грунтуючись на регулярному виразі або звичайною текстовому рядку.
Види символів
У регулярних виразах розрізняють наступні види символів:
Звичайні символи

 A.. Z - англійські літери від A до z, малі й великі;
 0 .. 9 - цифри;
{} - фігурні дужки, крім випадків, коли вони складають групу виду (n, m) (де n і m - числа) і її варіації;
 = - рівне;
 < - Менше;
 > - Більше;
 - - Мінус;
 , - Кома;
  та ін.

Спеціальні символи

() - Круглі дужки;
[] - Квадратні дужки;
 \ - Обраний слеш;
 . - Точка;
 ^ - Ступінь;
 $ - Знак долара;
 | - Вертикальна лінія;
 ? - Знак питання;
 + - Плюс.

Спецсимволи в регулярному виразі

Символ Значення
\ Для звичайних символів - робить їх спеціальними. Наприклад, вираз / s / шукає просто символ 's'. А якщо поставити \ перед s, то / \ s / вже позначає пробільний символ. І навпаки, якщо символ спеціальний, наприклад *, то \ зробить його просто звичайним символом "зірочка". Наприклад, / a * / шукає 0 або більше поспіль йдуть символів 'a'. Щоб знайти а із зірочкою 'a *' - поставимо \ перед спец. символом: / a \ * /.
^ Позначає початок вхідних даних. Якщо встановлений прапор багаторядкового пошуку ("m"), то також спрацьовує при початку нової рядка. Наприклад, / ^ A / не знайде 'A' в "an A", але знайде перші 'A' в "An A."
$ <Позначає кінець вхідних даних. Якщо встановлений прапор багаторядкового пошуку, то також спрацює в кінці рядка. Наприклад, / t $ / не знайде 't' в "eater", але знайде - в "eat".
* Позначає повторення 0 або більше разів. Наприклад, / bo * / знайде 'boooo' в "A ghost booooed" і 'b' в "A bird warbled", але нічого не знайде в "A goat grunted".
+ Позначає повторення 1 або більше разів. Еквівалентно (1,). Наприклад, / a + / знайде 'a' в "candy" і все 'a' в "caaaaaaandy"./td>
? Означає, що елемент може як бути присутнім, так і бути відсутнім. Наприклад, / e? Le? / Знайде 'el' в "angel" і 'le' в "angle." Якщо використовується відразу після одного з квантіфікаторов *, +,?, Або (), то задає "нежадібних" пошук (повторення мінімально можлива кількість разів, до найближчого наступного елемента патерну), на противагу "жадібному" режиму за замовчуванням, при якому кількість повторень максимально, навіть якщо наступний елемент патерну теж підходить. Крім того,? використовується в попередньому перегляді, який описаний в таблиці під (?=), (?!), і (?:).
. (Десяткова точка) позначає будь-який символ, крім перекладу рядки: \ n \ r \ u2028 or \ u2029. (Можна використовувати [\ s \ S] для пошуку будь-який символ, включаючи переклади рядків). Наприклад, /. N / знайде 'an' і 'on' в "nay, an apple is on the tree", але не 'nay'.
(x) Знаходить x і запам'ятовує. Це називається "запам'ятовуючі дужки". Наприклад, / (foo) / знайде і запам'ятає 'foo' в "foo bar." Знайдена підрядка зберігається в масиві-результаті пошуку або в наперед визначених властивості об'єкта RegExp: $ 1, ..., $ 9. Крім того, дужки об'єднують те, що в них знаходиться, в єдиний елемент патерну. Наприклад, (abc) * - повторення abc 0 і більше разів.
(?:x) Знаходить x, але не запам'ятовує знайдене. Це називається "незапям’ятовуючи дужки". Знайдена підрядка не зберігається в масиві результатів та властивості RegExp. Як і всі дужки, об'єднують що знаходиться в них в єдиний підпатерн.
x(?=y) ЗЗнаходить x, тільки якщо за x слід y. Наприклад, / Jack (? = Sprat) / знайде 'Jack', тільки якщо за ним слідує 'Sprat'. / Jack (? = Sprat | Frost) / знайде 'Jack', тільки якщо за ним слідує 'Sprat' або 'Frost'. Однак, ні 'Sprat' nor 'Frost' не увійдуть в результат пошуку.
x(?!y) Знаходить x, тільки якщо за x не слід y. Наприклад, / \ d + (?! \.) / Знайде число, тільки якщо за ним не слід десяткова крапка. / \ D + (?! \.) /. Exec ("3.141") знайде 141, але не 3.141.
x|y Знаходить x або y. Наприклад, / green | red / знайде 'green' в "green apple" і 'red' в "red apple."
{n} Де n - позитивне ціле число. Знаходить рівно n повторення попереднього елемента. Наприклад, / a (2) / не знайде 'a' в "candy," але знайде обидва a в "caandy," і перші два a в "caaandy."
{n,} Де n - позитивне ціле число. Знаходить n і більш за повторення елементу. Наприклад, / a (2,) не знайде 'a' в "candy", але знайде всі 'a' в "caandy" і в "caaaaaaandy."
{n,m} Де n і m - позитивні цілі числа. Знаходять від n до m повторень елемента.
[xyz] Набор символов. Находит любой из перечисленных символов. Вы можете указать промежуток, используя тире. Например, [abcd] - то же самое, что [a-d]. Найдет 'b' в "brisket" и 'c' в "ache".
Object результат перетворення значення об'єкта за замовчуванням