Регулярні вирази JavaScript. Виразний JavaScript: Регулярні вирази Робота з регулярними виразами в javascript

💖 Подобається?Поділися з друзями посиланням

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

Синтаксис:

//Перший варіант створення регулярного вираження var regexp=new RegExp( шаблон,модифікатори); //Другий варіант створення регулярного вираження var regexp=/ шаблон/модифікатори;

шаблондозволяє встановити шаблон символів для пошуку.

модифікаторидозволяють налаштувати поведінку пошуку:

  • i- Пошук без урахування регістру літер;
  • g- глобальний пошук (знайдено всі збіги в документі, а не тільки перше);
  • m- Багаторядковий пошук.

Пошук слів та виразів

Найпростішим застосуванням регулярних виразів є пошук слів та виразів у різних текстах.

Наведемо приклад використання пошуку із застосуванням модифікаторів:

//Задамо регулярний вираз rv1 rv1=/Росія/; //Задамо регулярне вираження rv2 rv2=/Росія/g; //Задамо регулярне вираження rv3 rv3=/Росія/ig; //Жирним шрифтом виділено, де у тексті знайдено збіги під час використання //вирази rv1: Росія є найбільшим державою світу. Росія межує із 18 країнами. РОСІЯ є державою-продовжувачем СРСР. //Жирним шрифтом виділено, де у тексті знайдено збіги під час використання //вирази rv2: Росія є найбільшим державою світу. Росія межує із 18 країнами. РОСІЯ є державою-продовжувачем СРСР."; //Жирним шрифтом виділено, де в тексті будуть знайдені збіги при використанні //вирази rv3: Росія є найбільшою державою світу. Росія межує з 18 країнами. РОСІЯ є державою - продовжувачем СРСР.";

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

Крім звичайних символів, у шаблонах регулярних виразів можуть використовуватися спеціальні символи(метасимволи). Спеціальні символи з описами наведені в таблиці нижче:

Спеціальний символ Опис
. Збігається з будь-яким символом, окрім символу кінця рядка.
\w Збігається з будь-яким літерним символом.
\W Збігається з будь-яким не літерним символом.
\d Збігається із символами, які є цифрами.
\D Збігається із символами, які не є цифрами.
\s Збігається із пробельними символами.
\S Збігається з непробільні символи.
\b Збіги шукатимуться лише на межах слів (на початку чи наприкінці).
\B Збіги шукатимуться тільки не на межах слів.
\n Збігається із символом перекладу рядка.

/* Вираз reg1 знайде всі слова, що починаються на дві довільні літери і закінчуються на "віт". Так як слова в реченні поділяються пробілом, то на початку і в кінці додамо спецсимвол \s) */reg1=/\s..вет\s/g; txt=" привіт завіт вельвет клозет "; document.write(txt.match(reg1) + "
"); /* Вираз reg2 знайде всі слова, що починаються на три довільні літери і закінчуються на "вет" */ reg2=/\s...вет\s/g; document.write(txt.match(reg2) + "
"); txt1=" при2віт привіт при1вет "; /* Вираз reg3 знайде всі слова, які починаються на "при" у яких потім слідує 1 цифра і закінчуються на "вет" */ var reg3=/при\dвет/g; .write(txt1.match(reg3) + "
"); // Вираз reg4 знайде всі цифри в тексті var reg4=/\d/g; txt2="5 років навчання, 3 роки плавання, 9 років стрілянини." document.write(txt2.match(reg4) + "
");

Швидкий перегляд

Символи у квадратних дужках

Використовуючи квадратні дужки [кейу]Ви можете вказати групу символів, які потрібно здійснити.

Символ ^ перед групою символів у квадратних дужках [^квг]говорить про те, що потрібно здійснити пошук усіх символів алфавіту крім заданих.

Використовуючи тире (-) між символами у квадратних дужках [а-з]Ви можете встановити діапазон символів, пошук яких потрібно зробити.

За допомогою квадратних дужок Ви також можете шукати числа.

// Задамо регулярне вираз reg1 reg1 = / \ sко [тдм] \ s / g; // Задамо рядок тексту txt1 txt1 = "кіт коса код комод ком килим"; //Зробимо за допомогою регулярного виразу reg1 пошук за рядком txt1 document.write(txt1.match(reg1) + "
"); reg2=/\sсло[^тг]/g; txt2=" слот слон склад "; document.write(txt2.match(reg2) + "
"); reg3=//g; txt3="5 років навчання, 3 роки плавання, 9 років стрільби"; document.write(txt3.match(reg3));

Швидкий перегляд

Квантифікатори

Квантифікатор- це конструкція що дозволяє задати скільки разів попередній символ або група символів повинна зустрічатися в збіг.

Синтаксис:

//Попередній символ повинен зустрічатися x - раз (x)//Попередній символ повинен зустрічатися від x до разів включно (x, y)//Попередній символ повинен зустрічатися не менше х разів (x,)//Вказує, що попередній символ повинен зустрічатися 0 або більше разів * //Вказує, що попередній символ повинен зустрічатися 1 або більше разів + //Вказує, що попередній символ повинен зустрічатися 0 або 1 раз ?


//Задамо регулярний вираз rv1 rv1=/ко(5)шка/g //Задамо регулярний вираз rv2 rv2=/ко(3,)шка/g //Задамо регулярний вираз rv3 rv3=/ко+шка/g //Задамо регулярний вираз rv4 rv4=/ко?шка/g //Задамо регулярний вираз rv5 rv5=/ко*шка/g //Жирним шрифтом показано, де в тексті будуть знайдені збіги при використанні //вирази rv1: кішка кішка кішка кішка коооошка коооо коооооошка кооооооошка //Жирним шрифтом показано, де в тексті будуть знайдені збіги при використанні //вирази rv2: кішка кішка кішка кооошка коооошка кооооошка коооооошка кооооооошка//Жирним шрифтом показано, де в тексті знайдено збіги при використанні //вирази rv3: кшка кішка кішка кооошка коооошка кооооошка коооооошка кооооооошка//Жирним шрифтом показано, де в тексті будуть знайдені збіги при використанні //вирази кішка кішка кішка кооошка коооошка кооооошка коооооошка кооооооошка

Зверніть увагу:якщо Ви хочете використовувати якийсь спеціальний символ (такий як. * + ? або ()) як звичайний Ви повинні поставити перед ним \.

Використання круглих дужок

Укладаючи частину шаблону регулярного виразу в круглі дужки, Ви вказуєте виразу запам'ятати збіг, знайдений цією частиною шаблону. Збережений збіг може використовуватися пізніше у Вашому коді.

Наприклад регулярне вираження /(Дмитро)Васильєв/ знайде рядок "Дмитро Васильєв" і запам'ятає підрядок "Дмитро".

У прикладі нижче ми використовуємо метод replace(), щоб змінити порядок слів у тексті. Для використання збережених збігів ми використовуємо $1 і $2.

Var regexp = / (Дмитро) \ s (Васильєв) /; var text = "Дмитро Васильєв"; var newtext = text.replace(regexp, "$2 $1"); document.write(newtext);

Швидкий перегляд

Круглі дужки можуть бути використані для угруповання символів перед квантифікаторами.

У цій статті розглянуто основи застосування регулярного виразу Javascript.

Вступ

Що таке регулярне вираження?

Регулярний вираз JS – це послідовність символів, що формує правило пошуку. Потім це правило можна використовувати для пошуку тексту, а також його заміни. На практиці регулярне вираження може складатися навіть із одного символу, але частіше зустрічаються складніші шаблони пошуку.

У JavaScript регулярні висловлювання також є об'єктами. Це шаблони, які використовуються для порівняння послідовностей символів у рядках. Вони використовуються в методах exec() та test() об'єкта RegExp, а також у методах match(), replace(), search та split() об'єкта String.

приклад

var pattern = /example/i

/example/i – це регулярне вираження. example – це шаблон ( який буде використовуватись у пошуку). i – це модифікатор, що вказує на чутливість до регістру.

Підготовка регулярного вираження

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

/pattern/modifiers;

Шаблон визначає правило пошуку. Він складається з простих символів на кшталт /abc/ або комбінації простих і спеціальних символів: /abc/ або /Chapter (d+).d/ .

Таблиця шаблонів

Модифікатори дозволяють зробити запити чутливими до регістру, глобальними тощо. Вони використовуються для проведення чутливого до регістру пошуку та глобального пошуку.

Таблиця модифікаторів

Тепер ми готові застосувати JS регулярні вирази. Існує два основних способи зробити це: використовуючи об'єкт регулярного виразу або регулярний вираз для рядка.

Використовуємо об'єкт регулярного вираження

Створюємо об'єкт регулярного вираження

Цей об'єкт описує шаблон символів. Він використовується для зіставлення шаблонів. Є два способи сформулювати об'єкт регулярного вираження.

Спосіб 1: використовуючи літерал регулярного виразу, який складається з шаблону, укладеного в слеші, наприклад:

var reg = / ab + c /;

Літерали регулярних виразів запускають попередню компіляцію регулярного виразу під час аналізу скрипта. Якщо регулярний вираз постійно, то скористайтеся ним, щоб збільшити продуктивність.

Спосіб 2: викликаючи функцію-конструктор об'єкта RegExp, наприклад:

var reg = new RegExp("ab+c");

Використання конструктора дозволяє виконати компіляцію регулярного виразу JS під час скрипту. Використовуйте даний спосіб, якщо регулярне вираз змінюватиметься або не знаєте шаблон заздалегідь. Наприклад, якщо ви отримуєте інформацію від користувача, який вводить пошуковий запит.

Методи об'єкта регулярного вираження

Познайомимося з декількома поширеними методами об'єкта регулярного вираження:

  • compile() ( застарів у версії 1.5) - компілює регулярне вираження;
  • exec() – здійснює зіставлення у рядку. Повертає перший збіг;
  • test() – здійснює зіставлення у рядку. Повертає значення true або false;
  • toString() – повертає мале значення регулярного вираження.

Приклади

Застосування test()

Метод test() – регулярне вираження об'єкта RegExp. Він шукає рядок шаблону, і в залежності від отриманого результату повертає значення true або false . Наступний JS регулярного виразу приклад показує, як відбувається пошук у рядку символу “ e”:

var patt = / e /; patt.test("Кращі у світі речі – безкоштовні!");

Оскільки тут у рядку є “ e”, результатом цього коду буде значення true.

Регулярні висловлювання зовсім необов'язково поміщати змінну. Такий самий запит можна провести в один рядок:

/e/.test("Кращі у світі речі – безкоштовні!");

Застосування exec()

Він здійснює пошук у рядку за заданим правилом пошуку, і повертає знайдений текст. Якщо збігів знайдено був, результатом буде null .

Подивимося метод у дії, з прикладу тієї самої символу “ e”:

/e/.exec("Кращі у світі речі – безкоштовні!");

Оскільки в рядку є “ e”, результатом цього коду буде .e.

Застосування регулярного виразу для рядка

У Javascript ці вирази можна використовувати з двома методами об'єкта String : search() і replace() . Вони потрібні для пошуку та заміни в тексті.

  • Метод search() — використовує вираз для пошуку відповідності, та повертає інформацію про розташування відповідності;
  • Метод replace() — повертає модифікований рядок із заміненим шаблоном.

Приклади

Застосування регулярного виразу JS для здійснення чутливого до регістру пошуку фрази “ w3schools" в рядку:

var str = "Visit W3Schools"; var n = str.search(/w3schools/i);

Результатом n буде 6.

Метод search також приймає рядок як аргумент. Аргумент string буде перетворено на регулярний вираз:

Застосування string для пошуку фрази “ W3schools" в рядку.

У JavaScript регулярні вирази представлені об'єктами RegExp. Об'єкти RegExp можуть бути створені за допомогою конструктора RegExp(), але вони частіше створюються за допомогою спеціального синтаксису літералів. Так само як рядкові літерали задаються у вигляді символів, укладених у лапки, літерали регулярних виразів задаються у вигляді символів, укладених у пару символів слеша / .

/pattern/прапори new RegExp("pattern"[, опції пошуку])

pattern- регулярний вираз для пошуку (про заміну - пізніше), а прапори - рядок з будь-якої комбінації символів g(глобальний пошук), i(регістр неважливий) та m(багаторядковий пошук). Перший спосіб використовується часто, другий – іноді. Наприклад, два таких виклики еквівалентні.

Опції пошуку

При створенні регулярного виразу ми можемо вказати додаткові опції пошуку

Символи у регулярних виразах JavaScript

СимволВідповідність
Алфавітно-цифрові символиВідповідають самі собі
\0 Символ NUL (u0000)
\tТабуляція (\u0009)
\nПереклад рядка (\u000A)
\vВертикальна табуляція (\u000B)
\fПереклад сторінки (\u000C)
\rПовернення каретки (\u000D)
\xnnСимвол набору Latin, що задається шістнадцятковим числом nn; наприклад, \x0A - це те саме, що \n
\uxxxxUnicode-символ, заданий шістнадцятковим числом xxxx; наприклад, \u0009 - це те ж саме, що \t
\cXКеруючий символ "X", наприклад, послідовність \cJ еквівалентна символу перекладу рядка \n
\ Для звичайних символів – робить їх спеціальними. Наприклад, вираз /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,). Наприклад, /a+/ знайде "a" у "candy" і все "a" у "caaaaaaandy".
? Позначає, що елемент може бути як присутній, так і відсутній. Наприклад, /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)Знаходить х і запам'ятовує. Це називається "дужки, що запам'ятовують". Наприклад, /(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" ні "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 повторень елемента.
Набір символів. Знаходить будь-який із перелічених символів. Ви можете вказати проміжок за допомогою тире. Наприклад, - те саме, що . Знайде "b" у "brisket", а також "a" та "c" в "ache".
[^xyz]Будь-який символ, крім зазначених у наборі. Ви також можете вказати проміжок. Наприклад, [^abc] - те саме, що [^a-c] . Знайде "r" у "brisket" і "h" у "chop."
[\b]Знаходить backspace символ. (Не плутати з b.)
\bЗнаходить межу слів (латинських), наприклад пропуск. (Не плутати з [b]). Наприклад, /\bn\w/ знайде "no" в "noonday"; /\wy\b/ знайде "ly" в "possibly yesterday."
\BПозначає не межу слів. Наприклад, /\w\Bn/ знайде "on" у "noonday", а /y\B\w/ знайде "ye" в "possibly yesterday."
\cXДе X – буква від A до Z. Позначає контрольний символ у рядку. Наприклад, /\cM/ означає символ Ctrl-M.
\dзнаходить цифру з будь-якого алфавіту (у нас юнікод). Використовуйте , щоб знайти лише звичайні цифри. Наприклад, /\d/ або // знайде "2" у "B2 is the suite number."
\DЗнайде нецифровий символ (усі алфавіти). [^0-9] – еквівалент для звичайних цифр. Наприклад, /\D/ або /[^0-9]/ знайде "B" у "B2 is the suite number."
\sЗнайде будь-який символ пробілу, включаючи пробіл, табуляцію, переклади рядка та інші юнікодні пробілові символи. Наприклад, /\s\w*/ знайде "bar" у "foo bar."
\SЗнайде будь-який символ, крім пробільного. Наприклад, /\S\w*/ знайде "foo" у "foo bar."
\vВертикальні табуляції символ.
\wЗнайде будь-який словесний (латинський алфавіт) символ, включаючи букви, цифри та знак підкреслення. Еквівалентно. Наприклад, /\w/ знайде "a" в "apple," "5" в "$5.28," і "3" в "3D."
\WЗнайде будь-який не-(лат.) словесний символ. Еквівалентно [^A-Za-z0-9_]. Наприклад, /\W/ і /[^$A-Za-z0-9_]/ однаково знайдуть "%" в "50%."

Робота з регулярними виразами у Javascript

Робота з регулярними виразами в Javascript реалізована методами класу String

exec(regexp) - знаходить всі збіги (входження до шаблону "регулярки") у рядку. Повертає масив (при збігу) і оновлює властивість regexp-а, або null - якщо нічого не знайдено. З модифікатором g - при кожному викликі цієї функції, вона повертатиме наступний збіг після попереднього знайденого - це реалізовано за допомогою ведення індексу зміщення останнього пошуку.

match(regexp) - знайти частину рядка за шаблоном. Якщо вказано модифікатор g, функція match() повертає масив всіх збігів або null (а не порожній масив). Без модифікатора g ця функція працює як exec();

test(regexp) - функція перевіряє рядок на відповідність шаблону. Повертає true – якщо є збіг, і false – якщо збігу немає.

split(regexp) - розбиває рядок, на яку він викликаний, на масив підрядків, використовуючи аргумент як разделителя.

replace(regexp, mix) - метод повертає рядок змінний відповідно до шаблону (регулярним виразом). Перший параметр regexp може містити рядок, а не регулярне вираз. Без модифікатора g - метод у рядку замінює лише перше входження; із модифікатором g - відбувається глобальна заміна, тобто. змінюються всі входження у цьому рядку. mix - шаблон заміни, може містити значення рядка, шаблону заміни, функції (ім'я функції).

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

Заміна через функцію

Якщо Ви вказуєте другий параметр функцію, то вона виконується при кожному збігу. У функції можна динамічно генерувати та повертати рядок підстановки. Перший параметр функції - знайдений підрядок. Якщо першим аргументом replace є RegExp, то наступні n параметрів містять збіги з вкладених дужок. Останні два параметри - позиція в рядку, на якому відбувся збіг і сам рядок.

new RegExp(pattern [, flags])

регелярний вираз заздалегідь

Відомо, що краще синтаксис літералу(/ Test/i).

Якщо ж регулярне вираз заздалегідь невідоме, краще створювати регулярне вираз (у символьному рядку) за допомогою конструктора (new RegExp).

Але зверніть увагу, оскільки "знак косої риси" грає роль перемикання коду, то в рядковому літереалі (new RegExp) його доводиться писати двічі: \\

Прапори

i ігнорування регістру при зіставленні

g глобальне зіставлення, на відміну від локального (за умовчанням, збіг лише з першим екземпляром шаблоном) допускає збіги з усіма екземплярами шаблону

Оператори

Що Як Опис Використання
i прапор робить рег. вираз, що не залежить від регістру /testik/i
g прапор глобальний пошук /testik/g
m прапор допускає зіставлення з багатьма рядками, які можуть бути отримані з тексту
оператор класу символів зіставлення з набором символів - будь-який символ в інтервалі від a до z;
^ оператор знак вставки крім [^a-z] - будь-який символ КРІМ символів в інтервалі від a до z;
- оператор дефіс вказуємо діапазон значень, включно - будь-який символ в інтервалі від a до z;
\ оператор екранування екранує будь-який наступний символ \\
^ оператор початку зіставлення зіставлення з шаблоном має відбутися на початку /^testik/g
$ оператор кінця зіставлення зіставлення з шаблоном має відбутися в кінці /testik$/g
? оператор? робить символ необов'язковим /t?est/g
+ оператор + /t+est/g
+ оператор + символ повинен бути присутнім одноразово або багаторазово /t+est/g
* оператор * символ повинен бути одноразово або багаторазово або взагалі відсутній /t+est/g
{} оператор () задаємо фіксовану кількість повторень символу /t(4)est/g
{,} оператор (,) задаємо число повторень символу у певних межах /t(4,9)est/g

Зумовлені класи символів

Зумовлений член Зіставлення
\t горизонтальна табуляція
\n Переклад рядка
. Будь-який символ, крім перекладу рядка
\d Будь-яка десята цифра, що рівнозначно
\D Будь-який символ, крім десятої цифри, що рівнозначно [^0-9]
\w Будь-який символ (цифри, літери та знак підкреслення) що рівнозначно
\W Будь-який символ, окрім цифр, літер та знака підкреслення, що рівнозначно [^A-Za-z0-9]
\s Будь-який символ пропуску
\S Будь-який символ, крім пробілу
\b Кордон слова
\B НЕ Кордон слова, яке внутр. частина

Групування ()

Якщо оператор, наприклад, + (/(abcd)+/) потрібно застосувати до групи члерів, можна скористатися круглими дужками () .

Фіксації

Частина регулярного виразу, укладена в круглі дужки (), називається фіксацією.

Розглянемо наступний приклад:

/^()k\1/

\1 це не будь-який символ з a, b, c.
\1 це який завгодно символ, який ініціює збіг з першим символом. Тобто символ, що збігся з \1 невідомий до дозволу регулярного виразу.

Нефіксовані групи

Дужки () використовуються у 2-х випадках: для групування та для позначення фіксацій. Але бувають ситуації, коли нам потрібно використовувати () тільки для групування, оскільки фіксація не потрібна, крім того, прибираючи зайві фіксації, ми полегшуємо роботу механізму обробки регулярних виразів.

Отже, щоб запобігти фіксаціїперед круглою дужкою, що відкриває, необхідно поставити: ?:

Str = "

Hello world!
"; found = str.match(/<(?:\/?)(?:\w+)(?:[^>]*?)>/i); console.log("found without fix:", found); // [ "
" ]

Функція test

Regexp.test()

Функція test перевіряє, чи є збіг регулярного виразу зі рядком (str). Повертає або true або false.

Приклад використання:

Javascript

function codeF(str)( return /^\d(5)-\d(2)/.test(str); ) //console.log(codeF("12345-12ss")); // true //console.log(codeF("1245-12ss")); // false

Функція match

str.match(regexp)

Функція match повертає масив значень або null якщо збігів не знайдено. Позначте: якщо в регулярному вираженні відсутній прапор g (для виконання глобального пошуку), то метод match поверне перший збіг у рядку, при цьому, як видно з прикладу, масив збігів потрапляють ФІКСАЦІЇ(Частина регулярного вираження укладена в круглі дужки).

Javascript

str = "За інформацією зверніться: Розділ 3.4.5.1"; re = /глава (\d+(\.\d)*)/i // з фіксаціями (без глобального прапорця) found = str.match(re) console.log(found); // ["Глава 3.4.5.1", "3.4.5.1", ".1"]

Якщо ж надати методу match() глобальне регулярне вираження (з прапорцем g), то буде повернено також масив, але з ГЛОБАЛЬНИМИ збігами. Тобто, зафіксовані результати не повертаються.

Javascript

str = "За інформацією зверніться: Розділ 3.4.5.1, Розділ 7.5"; re = /глава (\d+(\.\d)*)/ig // без фіксацій - глобально found = str.match(re) console.log(found); // ["Глава 3.4.5.1", "Глава 7.5"]

Функція exec

regexp.exec(str)

Функція exec перевіряє, чи є збіг регулярного виразу зі рядком (str). Повертає масив результатів (з фіксаціями) або null. При кожному наступному виклику методу exec (наприклад, при використання while) відбувається (за рахунок автоматичного оновленняпри виконанні exec індексу кінця останнього пошуку lastIndex) перехід до наступного глобального збігу (якщо у казан прапорець g).

Javascript

var html = "
BAM! BUM!
"; var reg = /<(\/?)(\w+)([^>]*?)>/g; //console.log(reg.exec(html)); // ["
", "", "div", " class="test""] while((match = reg.exec(html)) !== null)( console.log(reg.exec(html)); ) /* [" ", "", "b", ""] [" ", "", "em", ""] ["
", "/", "div", ""] */

Без глобального прапорця методи match та exec працюють ідентично. Тобто повертають масив із першим глобальним збігом та фіксаціями.

Javascript

// match var html = "
BAM! BUM!
"; var reg = /<(\/?)(\w+)([^>]*?)>/; // без глобального console.log(html.match(reg)); // ["
", "", "div", "class="test""] // exec var html = "
BAM! BUM!
"; var reg = /<(\/?)(\w+)([^>]*?)>/; // без глобального console.log(reg.exec(html)); // ["
", "", "div", "class="test""]

Функція replace

str.replace(regexp, newSubStr|function)
  • regexp – реєстр. вираз;
  • newSubStr - рядок, на який змінюється знайдений вираз у тексті;
  • function – викликається для кожного виявленого збігу зі змінним списком параметрів (нагадаємо, що при глобальному пошуку у рядку виявляються всі екземпляри збігу із шаблоном).

Значення цієї функції служить як заміна.

Параметри функції:

  • 1 - Повний підрядок, що збігся.
  • 2 - значення дужних груп (фіксацій).
  • 3 - індекс (позиція) збігу у вихідному рядку.
  • 4 - Початковий рядок.

Mетод не змінює рядок, що викликає, а повертає новий, після заміни збігів. Щоб зробити глобальний пошук та заміну, використовуйте regexp c прапором g .

"GHGHGHGTTTT".replace(//g,"K"); //"KKKKKKKKKKKK"

Javascript

function upLetter(allStr,letter) ( return letter.toUpperCase(); ) var res = "border-top-width".replace(/-(\w)/g, upLetter); console.log(res); //borderTopWidth

Регулярні вирази- це мова, яка описує шаблони рядків, що базуються на метасимволах. Метасимвол – це символ у регулярному виразі, який описує певний клас символів рядка, вказує на положення підрядка, вказує кількість повторень чи групує символи у підрядок. Наприклад, метасимвол \d описує цифри, а $ означає кінець рядка. У регулярному вираженні можуть бути і звичайні символи, які описують себе. Набір і значення метасимволів у регулярних виразах описує стандарт PCRE, більшість можливостей якого підтримується JS.

Область застосування регулярних виразів

Регулярні вирази використовуються, як правило, для наступних завдань:

  • Зіставлення. Метою цього завдання буде з'ясувати, чи відповідає певний текст заданого регулярного виразу.
  • Пошук. За допомогою регулярних виразів зручно знаходити відповідні підстроки і витягувати їх з тексту.
  • Заміна. Регулярні висловлювання часто допомагають не тільки знайти, а й замінити в тексті підрядок, що відповідає регулярному виразу.

У кінцевому рахунку за допомогою регулярних виразів можна, наприклад:

  • Перевірити правильність заповнення даних у формі.
  • Знайти у тексті, що вводиться користувачем, посилання на зображення, для подальшого його автоматичного прикріплення до повідомлення.
  • Забрати з тексту html-теги.
  • Перевіряйте код до компіляції на наявність простих синтаксичних помилок.

Особливості регулярних виразів у JS. Літерали регулярних виразів

Головною особливістю регулярних виразів у JS є те, що для них існує окремий вид літералів. Як рядкові літерали обрамляються лапками, літерали регулярних виразів обрамляються слешами (/). Таким чином, JS-код може містити вирази виду:

console.log(typeof /tcoder/); // object

Справді регулярний вираз, що визначається у рядку

var pattern = новий RegExp("tcoder");

Цей спосіб створення зазвичай використовується, коли необхідно використовувати в регулярному виразі змінні або створювати регулярне вираз динамічно. В інших випадках використовують літерали регулярних виразів через більш короткий синтаксис і відсутність необхідності додатково екранувати деякі символи.

Символи у регулярних виразах

Усі алфавітно-цифрові символи у регулярних висловлюваннях є метасимволами і описують себе. Це означає, що регулярному виразу /tcoder/буде відповідати підрядок tcoder. У регулярних виразах також можна вказувати не алфавітні символи, такі як: переклад рядка (\n), табуляція (\t) і так далі. Всі ці символи відповідають самі собі. Поставлений перед алфавітним символом зворотний слєш (\) зробить його метасимволом, якщо такий є. Наприклад, алфавітний символ «d» стане метасимволом, який описує цифри, якщо його попередити слешем (\d).

Класи символів

Поодинокі символи в регулярних виразах можна групувати класи за допомогою квадратних дужок. Створеному таким чином класу відповідає будь-який із включених до нього символів. Наприклад, регулярному виразу // відповідатимуть літери "t", "c", "o", "d", "e", "r".

У класах також можна задавати діапазон символів за допомогою дефісу. Наприклад, класу відповідає клас. Зауважимо, деякі метасимволи в регулярних висловлюваннях вже описують класи символів. Наприклад, метасимвол \d еквівалентний класу . Зауважимо, що метасимволи, що описують класи символів, можуть включатися в класи. Наприклад, класу [\da-f] відповідають цифри та літери "a", "b", "d", "e", "f", тобто будь-який шістнадцятковий символ.

Існує також можливість описати клас символів, вказавши символи, які не повинні до нього входити. Робиться це за допомогою метасимволу. Наприклад, класу [^\d] відповідатиме будь-який символ крім цифри.

Повторення

Тепер ми можемо описати, скажімо, десяткове числобудь-якої заданої довжини, просто написавши підряд стільки метасимволів \d, скільки цифр у цьому числі. Погодьтеся, що такий підхід не дуже зручний. До того ж ми не можемо описати діапазон необхідної кількості повторень. Наприклад, ми не можемо описати число з однієї чи двох цифр. На щастя, у регулярних виразах існує можливість описувати діапазони повторень за допомогою метасимволів. Для цього після символу досить просто вказати діапазон повторень у фігурних дужках. Наприклад, регулярному виразу /tco(1, 3)der/будуть відповідати рядки "tcoder", "tcooder" та "tcooоder". Якщо опустити максимальну кількість повторень, залишивши кому і мінімальну кількість повторень, можна вказати кількість повторень більше заданого. Наприклад, регулярному виразу /bo(2,)bs/будуть відповідати рядки "boobs", "booobs", "boooobs" і так далі з будь-якою кількістю букв "о" не менше двох.

Якщо у фігурних дужках опустити і кому, просто вказавши одне число, воно позначатиме точну кількість повторень. Наприклад, регулярному виразу / d (5) /відповідають п'ятицифрові числа.

Деякі діапазони повторень використовуються досить часто і для їх позначень є метасимволи.

Жадібні повторення

Наведений вище синтаксис описує максимальну кількість повторень, тобто з усіх можливих кількостей повторень, кількість яких лежить у вказаному діапазоні вибирається максимальне. Такі повторення називають жадібними. Це означає, що регулярному виразу /d+/ у рядку yeah!!111 буде відповідати підрядок «111», а не «11» або «1», хоча метасимвол «+» описує одне і більше повторень.

Якщо ви хочете реалізувати нежадібне повторення, тобто вибирати мінімальну можливу кількість повторень із зазначеного діапазону, то просто поставте символ "?" після діапазону повторень. Наприклад, регулярному виразу /\d+?/у рядку «yeah!!111» відповідатиме підрядок «1», а регулярному виразу /\d(2,)/у тому ж рядку буде відповідати підрядок «11».

Варто звернути увагу на важливу особливість нежадібного повторення. Розглянемо регулярний вираз /bo(2,)?bs/. У рядку "i like big boooobs" йому відповідатиме, як і при жадібному повторенні, підрядок boooobs, а не boobs, як можна було подумати. Справа в тому, що регулярному виразу при одному зіставленні не може відповідати кілька підрядків, розташованих у різних місцях рядка. Тобто, нашому регулярному виразу не можуть відповідати підрядки boo і bs, склеєні в один рядок.

Альтернативи

У регулярних виразах так само можна використовувати альтернативи - описувати безліч рядків, що відповідає або одній або іншій частині регулярного виразу. Такі частини і називаються альтернативами та поділяються за допомогою вертикальної риси. Наприклад, регулярному виразу /two|twice|\2/може відповідати або підрядок «two», або підрядок «twice», або підрядок «2». Ланцюжок альтернатив обробляється зліва направо до першого збігу і може відповідати лише підрядок, яку описує лише одне альтернатива. Наприклад, регулярному виразу /java|script/у рядку «I like javascript» відповідатиме лише підрядок «java».

Угруповання

Щоб розглядати кілька символів як єдине ціле при використанні діапазонів повторень, класів символів та іншого, досить просто взяти їх у круглі дужки. Наприклад, регулярному виразу /true(coder)?/відповідатимуть рядки «truecoder» та «true».

Посилання

Крім того, що круглі дужки об'єднують символи в регулярному вираженні в єдине ціле, на відповідний їм підрядок можна посилатися, просто вказавши після слєшу номер лівої дужки з пари дужок, що обрамляють його. Дужки нумеруються зліва на право починаючи з одиниці. Наприклад, у регулярному вираженні /(one(two)(three))(four)/\1 посилається на one, \2 на "two", \3 на "three", \4 на "four". Як приклад використання таких посилань наведемо регулярний вираз /(\d)\1/, якому відповідають двоцифрові числа з однаковими цифрами. Важливим обмеженнямвикористання зворотних посилань є неможливістю їх використання в класах, тобто, наприклад, описати двозначне число з різними цифрамирегулярним виразом /(\d)[^\1]/не можна.

Незапам'ятовують дужки

Часто буває необхідно просто згрупувати символи, але не потрібно створювати посилання. У цьому випадку можна відразу після лівої дужки, що групує, можна написати?:. Наприклад, у регулярному вираженні /(one)(?:two)(three)/\2 вказуватиме на «three».

Такі дужки іноді називають незапам'ятними. Вони мають ще одну важливу особливість, про яку ми поговоримо у наступному уроці.

Вказівка ​​позиції

У регулярних виразах також існують метасимволи, які вказують на деяку позицію в рядку. Найчастіше використовуються символи ^, $, що вказують на початок і кінець рядка. Наприклад, регулярному виразу /\..+$/ будуть відповідати розширення в назвах файлів, а регулярному виразу /^\d/перша цифра у рядку, якщо вона є.

Позитивна та негативна випереджувальні перевірки

За допомогою регулярних виразів так само можна описати підрядок, за яким слідує або не слідує підрядок, описаний іншим шаблоном. Наприклад, нам необхідно знайти слово java тільки якщо за ним слідує «script». Це завдання можна вирішити за допомогою регулярного вираження /java(?=script)/. Якщо ж нам потрібно описати підрядок «java» за яким не слід script можна скористатися регулярним виразом /java(?!script)/.

Зберемо все те, що ми говорили вище в одну табличку.

Символ Значення
a|b Відповідає або а, або в.
(…) Групувальні дужки. Також на підрядок, відповідну шаблону в дужках можна посилатися.
(?:…) Тільки угруповання, без можливості посилатися.
\n Посилання на підрядок, що відповідає n-му шаблону.
^ Початок вхідних даних або початок рядка.
$ Кінець вхідних даних або кінець рядка.
a(?=b) Відповідає підрядку, який описує шаблон a, тільки якщо за ним слідує підрядок, описаний шаблоном b.
a(?!b) Відповідає підрядку, який описує шаблон a, тільки якщо за ним неслід підрядок, описаний шаблоном b.

Прапори

І, нарешті, останній елемент синтаксису регулярних виразів. Прапори задають правила відповідності, які стосуються всього регулярного виразу. На відміну від інших елементів, синтаксис регулярних виразів вони пишуться відразу після літералу регулярного виразу, або передаються в рядку як другий параметр конструктору об'єкта RegExp.

У JavaScript існують лише три прапори регулярних виразів:

i– при вказівці цього прапора регістр не враховується, тобто, наприклад, регулярного виразу \javascript\iбудуть відповідати рядки "javascript", "JavaScript", "JAVASCRIPT", "jAvAScript" і т.д.

m- Цей прапор включає багаторядковий пошук. Це означає, що якщо в тексті є символи перекладу рядків і цей прапор поставлений, то символи ^ і $ крім початку і кінця тексту будуть відповідати так само ще початку і кінця кожного рядка в тексті. Наприклад, регулярному виразу /line$/mвідповідає підрядок "line", як у рядку "first line", так і в рядку "one\nsecond line\ntwo".

g- включає глобальний пошук, тобто регулярному виразу, якщо цей прапор включений, будуть відповідати всі підрядки, що збіглися з ним, а не тільки перша, як у випадку, якщо цього прапора немає.

Прапори можна комбінувати між собою у довільному порядку, тобто \coder\mig, \tcоder\gim, \tocder\gmiі т.д., це те саме. Порядок прапорів так само не має значення, якщо їх передавати в рядку як другий аргумент конструктору об'єкта RegExp, тобто New RegExp("tcoder", "im")і New RegExp("tcoder", "im")так само одне й теж.

З.И.

Регулярні вирази це дуже потужний і зручний інструментдля роботи з рядками, що дозволяє скоротити сотні рядків коду до одного виразу. На жаль, їхній синтаксис іноді занадто складний і важко читаємо і навіть найдосвідченіший розробник може забути, що означало досить складне регулярне вираження, яке він писав кілька днів тому, якщо він його не прокоментував. З цих причин іноді все ж таки варто відмовитися від регулярних виразів на користь звичайних методів для роботи з рядками.



Розповісти друзям