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

Використовуються для пошуку та перевірки даних у тексті.

Перевірка або пошук здійснюється за допомогою складання шаблонів та знаходження відповідності до цього шаблону.

При побудові таких шаблонів використовують спеціальні символи.

Ці символи відповідають наступним виразам:

  • будь-який символ

  • не цифра

  • не буква

  • Проміжок від і до

І ці спеціальні символи та правила їх застосування становлять мову регулярних виразів.

За допомогою якого рядки можна обробляти – перевіряти, розділяти, замінювати тощо.

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

У термінах регулярних виразів часто використовуються слова “шаблон” чи “маска”.

Шаблон регулярного вираження у JavaScript можна створити двома способами - літералом та конструктором.

Літерал є виразом виду

"/шаблон/прапори"

Цей вираз може бути наданий змінною.

var template1 = /\D/

Створення з допомогою конструктора.

var mask = new RegExp("шаблон", "прапори")

У такому разі і шаблон, і прапори беруться у лапки.

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

Основні засоби використання.

  • перевірка рядка на відповідність шаблону;

  • поділ рядка на частини за шаблоном;

  • Перетворення рядка за шаблоном.

Перевірка здійснюється методом test(str). Аргументом передається рядок, який потрібно перевірити.

Приклад.

template = /1/
template.test("123")
template.test("234")
template.test("I am 21 years old")

Наведемо список деяких спеціальних символів.

\d Будь-яка цифра

\s Пробіловий символ (пробіл, табуляція, розрив рядка)

\w Символ, допустимий у слові (англ. word-symbol): велика або маленька літера, а також цифри або підкреслення

. (точка) Будь-який символ (крім розриву рядка)

\DЧи не цифра

\S Не символ пробілу

Наприклад, використаний нами як сам перший приклад шаблон /\D/ означає наявність знака “\D” у рядку, а цей знак означає не цифра.

Квадратні дужки []

Позначають набір символів.

У цих дужках перераховуються символи, що входять до бажаного набору. Причому наявність пробілу чи коми всередині дужок буде вважатися, що символ пробілу або комою також входить до набору.

Символи з набору перевіряються за правилом «АБО»

template = /[12]/

Цей приклад перевірить рядок на наявність символів 1 або 2.

Можна вказати інтервал:

[1-4] символи (цифри) від 1 до 4

[a-z] символи (літери) від "a" до "z" (маленькі)

[A-Z] символи (літери) від «A» до «Z» (великі)

[г-ж] символи (літери) від «г» до «ж»

[0-9A-F] шістнадцяткові цифри 0123456789ABCDEF

Завдання:

** Відкрити консоль та перевірити рядок на наявність email, ip адреси **

Ми можемо вказати НЕДОПУСНІСТЬ символів за допомогою кришки ^.

template = /[^123]/

Для вказівки кількості символів, що йдуть поспіль, або їх набору використовуються квантифікарори (модифікатори).

? 0 або 1 раз

+ 1 і більше разів

* 0 і більше разів

{2} рівно 2 повтори (число довільне)

{2,} 2 і більше повторів (число довільне)

{2,7} від 2 до 7 повторів (числа довільні)

\d{7} означає «сім цифр поспіль»,

** Відкрити консоль та перевірити рядок на наявність номера телефону **

https? - дозволяє http і https

Квантифікатор “?” відноситься лише до найближчого символу.

Символи-якоря

Вказують на певне місце у рядку.

^ - початок рядка

$ - кінець рядка.

Часто використовуються для створення маршрутів (масок URL адрес)

Наприклад, якщо потрібно переконатися, що рядок url ​​починається з символу слова user, то застосуємо шаблон template = /^user/

Увага! Символ має двояке значення в залежності від того де застосовується.

Якщо він стоїть на початку групи “[^…]”, то він “забороняє” символи означаючи НЕ або КРІМ.

Самостійно скласти вираз “рядок закінчується будь-якою цифрою”.

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

Список таких символів

^ $ [ ] ( ) { } . * + \ ? < > |\ \

Методи об’єктів String та RegExp для роботи з регулярними виразами

Роботу з регулярними шаблонами забезпечують об’єкти типу RegExp, і об’єкти типу String.

Метод exec, крім перевірки, ще проводить пошук за шаблоном.

Наприклад.

str = "20% of population owning 80% income"
template = /\d+/
template.exec(str)

Поверне об’єкт першого входження.

Для того щоб знайти наступні, застосовуються прапори.

template = /\d+/g

g - Світовий пошук.

За наявності прапора “g” метод “exec” можна викликати кілька разів, отримуючи нові збіги із шаблоном. Якщо збігів немає – поверне null.

Метод match

Працює схоже на exec тільки результат з прапором g буде різний.

При записі цього методу програмна інструкція як би “перевертається” - метод “match” викликається у рядковій змінній (str), а як аргумент йому передається регулярний шаблон (template):

str.match(template)

З прапором g повертає список входжень.

Метод replace

Замінює рядок у відповідності з регулярним виразом.

str="67-00-53"
str.replace("-","")

Завдання: прибирати рисочки у полі введення при наборі.

Увага! replace прибере лише перше входження, якщо не вказано прапор g.

Прибирати можемо у проміжку.

str = "67 - 00 - 53"
str.replace(/[- ]/g,"")

Завдання: створіть шаблон і перевірте його працездатність для ситуації, коли номер телефону допускається ще й круглі дужки. Для перевірки можете використовувати телефон у форматі “(0512) 67-00-53”.

Метод split

Розділяє рядок за регулярним виразом.

str.split(",")

Завдання. Використовуючи модифікатор \W розділити рядки

str1 = "Smith John"
str2 = "Smith, John"

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

Прапор i

Реєстронезалежний пошук.

template = /yes/i

практика.

Створити форму та повісити функцію перевірки на onsubmit=”return checkForm()”.

Функція при помилці валідації поверне false, запобігши відправленню форми.

правила форми.

  1. У імені (та прізвища) можуть бути лише літери.

Задане правило найпростіше перевіряти «від зворотного» — якщо в рядку є щось, окрім літер, то перевірка вважається не пройденою.

function checkForm(){
    var n1 = document.getElementById("name1").value;
    var t1 = /[^a-z]/i;
    if(t1.test(n1))
    alert("First name is incorrect");
    return false;
}
  1. Перша буква імені має бути великою.

    /^[A-Z][a-z]*$/

    function checkForm(){ var n1 = document.getElementById(“name1”).value; var t1 = /^[A-Z][a-z]*$/; if(!t1.test(n1)) alert(“First name is incorrect”); return false; }

  2. Складові імена потрібно перевіряти кожне окремо за шаблоном «Велика літера» далі «маленькі» потім “тире” і знову “Велика”, потім “маленькі”.

    /^[A-Z][a-z](-[A-Z][a-z])*$/

  3. Перша літера в них може бути великою і після неї можливий апостроф. O’Brian

    /^[A-Za-z]’?[A-Za-z][a-z]*$/