Шпаргалка за регулярними виразами. Приклад: видаляємо великі літери. Робота з регулярними виразами у Javascript

Regex або регулярні вирази лякають новачків, але потрібні будь-якому програмісту. Давайте розберемося в регулярних виразах на 5 простих прикладах JavaScript.

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

Але фактично, будь-який regex – це лише шаблонне вираз, здатне в один рядок вирішити задачу цілої функції. Однак для побудови регулярного виразу необхідно враховувати набір суворих правил, у яких новачок може заплутатися та помилитися.

Збігаються символи

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

1. Крапка (.) відповідає будь-якому символу. Якщо потрібно шукати саме точку, її необхідно екранувати символом «\» (\.).

2. Знак питання (?) означає, що попередній символ є необов'язковим. Щоб шукати сам знак питання у рядку, його також необхідно екранувати за допомогою \ (\?).

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu."; // Підійдуть обидва і " elit " , і " elat " . Крапка означає, що підійде будь-якийсимвол. var regex = / el.t/g; console.log(text.match(regex)); // "est" і "lest" однаково підійдуть. Знак питання робить "l" необов'язковим. var regex2 = /l?est/g; console.log(text.match(regex2));

var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit lest. Donec convallis dignissim ligula, et rutrum est elat vistibulum eu." ;

// Підійдуть обидва і " elit " , і " elat " . Крапка означає, що підійде будь-який символ.

var regex = / el.t/g;

console. log (text. match (regex));

// "est" і "lest" однаково підійдуть. Знак питання робить "l" необов'язковим.

var regex2 = /l?est/g;

console. log (text. match (regex2));

Збіг безлічі символів

Безліч – це один або кілька символів, укладених у дужки, наприклад. Такий вираз шукатиме в рядку лише цей набір символів – у даному прикладітільки a, b чи c. Можна навпаки, шукати входження будь-яких символів, крім символу «^». [^ abc] буде відповідати будь-якому символу, який не є a, b або c. Також можна вказати діапазон символів або чисел, наприклад .

Існують вбудовані набори символів, які спрощують запис регулярних виразів. Їх називають скороченнями або шортами. Наприклад, замість цього можна написати \D. Є скорочення і інших символів (включаючи цифри і знак підкреслення) – \w і \W, і навіть для прогалин — \s і \S.

// Підійдуть лише "cat" та "can", але не "car". var text = "cat car can"; console.log(text.match(/ca/g)); // Пройде все, крім cat і can (є символ ^) console.log(text.match(/ca[^tn]/g)); // Ще один приклад, де пройдуть лише цифри text = "I would like 8 cups of coffee, please."; console.log("How many cups:" + text.match(//g)); // Простіший спосіб за допомогою скорочення \d console.log("How many cups:" + text.match(/\d/g)); // Мине все, крім цифр console.log(text.match(/\D/g));

// Підійдуть лише "cat" та "can", але не "car".

var text = "cat car can";

console. log (text. match (/ ca/g));

// Пройде все, крім cat і can (є символ ^)

console. log (text. match (/ ca [^ tn] / g));

// Ще один приклад, де пройдуть лише цифри

text = "Я маю 8 копійок з кафе, please." ;

console. log ("How many cups:" + text. match (// g));

// Простіший спосіб за допомогою скорочення \d

console. log ("How many cups:" + text. match (/ d / g));

// Пройде все, крім цифр

console. log (text. match (/ \ D / g));

Збігаються слова

У більшості випадків вам потрібно шукати цілі слова, а не окремі символи. Це робиться за допомогою модифікаторів (+) та (—), які повторюють символ або набір символів.

Додавання (X) задає точну кількість повторень, (x, y) – діапазон (x та y – числа).

Крім того, є спеціальний шаблон, який відповідає межам на кінцях слів.

var text = "Hello people of 1974. I come from the future. У 2014 ми маємо ласувальні guns, hover boards and live on the moon!"; // Знайде роки. \d+ знайде один і більше символів var yearRegex = /\d+/g; console.log("Years: ", text.match(yearRegex)); // Знайде всі пропозиції. Наші пропозиції починаються з великої літери, а закінчуються точкою або знаком оклику. var sentenceRegex = /.+?(\.|!)/g; console.log("Sentences:", text.match(sentenceRegex)); // Знайде всі слова, що починаються "h". Нам підійдуть і великі та малі, так що використовуємо модифікатор i // для визначення межі слів. var hWords = /\bh\w+/ig; console.log("H Words: ", text.match(hWords)); // Знайде всі слова від 4 до 6 символів var findWords = /\b\w(4,6)\b/g; console.log("Words between 4 and 6 chars: ", text.match(findWords)); // Знайде слова довше 5 символів console.log("Words 5 chars or longer: ", text.match(/\b\w(5,)\b/g)); // Знайде слова точно 6 символів довжиною console.log("Words exactly 6 chars long: ", text.match(/\b\w(6)\b/g));

var text = "Hello people of 1974. I come from the future. ;

// Знайде роки. \d+ знайде один і більше знаків

var yearRegex = /\d+/g ;

console. log ("Years:", text. match (yearRegex));

// Знайде всі пропозиції. Наші пропозиції починаються з великої літери, а закінчуються точкою або знаком оклику.

var sentenceRegex = /.+?(\.|!)/g;

console. log ("Sentences:", text. match (sentenceRegex));

// Знайде всі слова, що починаються "h". Нам підійдуть і великі та малі, так що використовуємо модифікатор i

// для визначення межі слів.

var hWords = /\bh\w+/i g;

console. log ("H Words:", text. match (hWords));

// Знайде всі слова від 4 до 6 символів

var findWords = /\b\w(4,6)\b/g ;

console. log ("Words between 4 and 6 chars:", text. match (findWords));

// Знайде слова довші за 5 символів

console. log ("Words 5 chars or longer: ", text. match (/\b\w(5,)\b/g));

// Знайде слова точно 6 символів завдовжки

console. log ("Words exactly 6 chars long: ", text. match (/\b\w(6)\b/g));

Валідація цілих рядків

У JavaScript такі вирази можна використовувати для перевірки введення користувача з текстових полів. Для валідації рядків використовується звичайне регулярне вираз, прив'язане до початку та кінця фрагмента тексту, що використовує для цього вирази ^ (початок рядка) та $ (кінець рядка). Ці символи гарантують, що шаблон, який Ви пишете, охоплює всю довжину тексту, а не тільки відповідає його частині.

Крім того, в цьому випадку ми використовуємо метод test() об'єкта regex, який повертає true або false при перевірці відповідності регулярного виразу рядку.

// У нас є масив рядків, давайте знайдемо посилання..com/", "123461", "https://сайт/?s=google", "http://not a valid url", "abc http:/ /invalid.url/" ]; var regex = /^https?:\/\/[\w\/?.&-=]+$/; var urls = ; for(var i = 0; i< strings.length; i++){ if(regex.test(strings[i])){ // Валидная ссылка urls.push(strings[i]); } } console.log("Valid URLs: ", urls);

// У нас є масив рядків, давайте знайдемо посилання.

var strings = [

"https://сайт/" ,

"this is not a URL" ,

"https://google.com/" ,

"123461" ,

"https://сайт/?s=google" ,

"http://not a valid url" ,

"abc http://invalid.url/"

var regex = / ^ https? : \ / \ / [ \ w \ / ? . &-=] + $/;

var urls =;

for (var i = 0; i< strings . length ; i ++ ) {

if (regex. test (strings [i]))) (

urls. push (strings [i]);

console. log ("Valid URLs:", urls);

Пошук та заміна

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

Модифікатори

Символ «мінус» (-) мер модифікатором (за винятком U) створює його заперечення.

Спецсимволи Аналог Опис
() підмаска, вкладений вираз
груповий символ
(a, b) кількість входжень від «a» до «b»
| логічне «або», у випадку з односимвольними альтернативами використовуйте
\ екранування спеціалізованого символу
. будь-який сивол, крім перекладу рядка
\d десяткова цифра
\D[^\d]будь-який символ, крім десяткової цифри
\f кінець (розрив) сторінки
\n переклад рядка
\pL буква в кодуванні UTF-8 під час використання модифікатора u
\r повернення каретки
\s[ \t\v\r\n\f]символ пробілу
\S[^\s]будь-який символ, крім промільного
\t табуляція
\w будь-яка цифра, буква або знак підкреслення
\W[^\w]будь-який символ, окрім цифри, літери або символу підкреслення
\v вертикальна табуляція
Спецсимволи всередині символьного класуПозиція всередині рядка Приклад Відповідність Опис
^ ^aa aa aaaпочаток рядка
$ a$aaa aaaкінець рядка
\A\Aaa aa aaa
aaa aaa
початок тексту
\za\zaaa aaa
aaa aaa
кінець тексту
\ba\b
\ba
aaa aaa
a aa a aa
межа слова, твердження: попередній символ словесний, а наступний - ні, або навпаки
\B\Ba\Baa a aa aвідсутність кордону слова
\G\Gaaaa aaaПопередній успішний пошук, пошук зупинився на 4-й позиції - там, де не знайшлося
Завантажити в PDF , PNG .Якоря

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

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

Символьні класи

Символьні класи у регулярних виразах відповідають відразу деякому набору символів. Наприклад, \d відповідає будь-якій цифрі від 0 до 9 включно, \w відповідає буквам і цифрам, а W - всім символам, крім букв і цифр. Шаблон, що ідентифікує літери, цифри та пробіл, виглядає так:

POSIX

POSIX це відносно нове доповнення сімейства регулярних виразів. Ідея, як і у випадку з символьними класами, полягає у використанні скорочень, що становлять певну групу символів.

Твердження

Спочатку практично у всіх виникають труднощі з розумінням тверджень, проте познайомившись із ними ближче, ви будете використовувати їх досить часто. Твердження надають спосіб сказати: «я хочу знайти в цьому документі кожне слово, що включає букву “q”, за якою не слідує “werty”».

[^\s]*q(?!werty)[^\s]*

Наведений вище код починається з пошуку будь-яких символів, крім пробілу ([^\s]*), за якими слідує q . Потім парсер досягає твердження, що «дивиться вперед». Це автоматично робить попередній елемент (символ, групу або символьний клас) умовним - він буде відповідати шаблону, тільки якщо твердження правильне. У нашому випадку, твердження є негативним (?!), Тобто воно буде вірним, якщо те, що в ньому шукається, не буде знайдено.

Отже, парсер перевіряє кілька таких символів за запропонованим шаблоном (werty). Якщо вони знайдені, то твердження хибне, а значить символ q буде «проігнорований», тобто не відповідатиме шаблону. Якщо ж werty не знайдено, то твердження вірне, і з q все гаразд. Потім продовжується пошук будь-яких символів, крім пропуску ([^\s]*).

Квантори

Квантори дозволяють визначити частину шаблону, яка має повторюватися кілька разів поспіль. Наприклад, якщо ви хочете з'ясувати, чи містить документ рядок від 10 до 20 (включно) букв «a», то можна використовувати цей шаблон:

A(10,20)

За замовчуванням квантори – «жадібні». Тому квантор + , що означає «один або більше разів», відповідатиме максимально можливому значенню. Іноді це викликає проблеми, і тоді ви можете сказати квантор перестати бути жадібним (стати «лінивим»), використовуючи спеціальний модифікатор. Подивіться цей код:

".*"

Цей шаблон відповідає тексту, укладеному в подвійні лапки. Однак, ваш вихідний рядок може бути на кшталт цього:

Привіт світ

Наведений вище шаблон знайде в цьому рядку такий підрядок:

"helloworld.htm" title="Привіт, Світ" !}

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

".*?"

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

"helloworld.htm" "Привіт, Світ"

Екранування в регулярних виразах

Регулярні вирази використовують деякі символи для позначення різних частин шаблону. Однак, виникає проблема, якщо вам потрібно знайти один із таких символів у рядку, як звичайний символ. Крапка, наприклад, у регулярному вираженні означає «будь-який символ, крім перенесення рядка». Якщо потрібно знайти точку в рядку, ви не можете просто використовувати « . » як шаблон - це призведе до знаходження практично всього. Отже, вам необхідно повідомити парсера, що ця точка повинна вважатися звичайною точкою, а не будь-яким символом. Це робиться за допомогою значка екранування.

Знак екранування, який передує символу на кшталт точки, змушує парсер ігнорувати його функцію і вважати звичайним символом. Є кілька символів, які потребують такого екранування у більшості шаблонів та мов. Ви можете знайти їх у правому нижньому кутку шпаргалки («Мета-символи»).

Шаблон для знаходження точки такий:

\.

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

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

Підстановка рядків докладно описана в наступному параграфі "Групи та діапазони", проте тут слід згадати про існування "пасивних" груп. Це групи, що ігноруються при підстановці, що дуже корисно, якщо ви хочете використовувати в шаблоні умову «або», але не хочете, щоб ця група брала участь у підстановці.

Групи та діапазони

Групи та діапазони дуже-дуже корисні. Ймовірно, простіше розпочатиме з діапазонів. Вони дозволяють вказати набір відповідних символів. Наприклад, щоб перевірити, чи містить рядок шістнадцяткові цифри (від 0 до 9 і від A до F), слід використовувати такий діапазон:

Щоб перевірити зворотне, використовуйте негативний діапазон, який у нашому випадку підходить під будь-який символ, крім цифр від 0 до 9 та літер від A до F:

[^A-Fa-f0-9]

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

Використовувати "або" дуже просто: наступний шаблон шукає "ab" або "bc":

Якщо в регулярному виразі необхідно послатися на якусь із попередніх груп, слід використовувати \n , де замість n підставити номер потрібної групи. Вам може знадобитися шаблон, що відповідає літерам «aaa» або «bbb», за якими слідує число, а потім ті ж три літери. Такий шаблон реалізується за допомогою груп:

(aaa|bbb)+\1

Перша частина шаблону шукає "aaa" або "bbb", поєднуючи знайдені літери в групу. За цим слідує пошук однієї або більше цифр (+), і нарешті \1. Остання частина шаблону посилається на першу групу і шукає те саме. Вона шукає збіг з текстом, вже знайденим першою частиною шаблону, а чи не відповідний йому. Таким чином, «aaa123bbb» не задовольнятиме вищенаведений шаблон, оскільки \1 шукатиме «aaa» після числа.

Одним з найбільш корисних інструментіву регулярних виразах є підстановка рядків. При заміні тексту можна послатися на знайдену групу за допомогою $n . Скажімо, ви хочете виділити у тексті всі слова «wish» жирним зображенням. Для цього вам слід використовувати функцію заміни за регулярним виразом, яка може виглядати так:

Replace(pattern, replacement, subject)

Першим параметром буде приблизно такий шаблон (можливо вам знадобляться кілька додаткових символів для цієї конкретної функції):

([^A-Za-z0-9])(wish)([^A-Za-z0-9])

Він знайде будь-які входження слова wish разом з попереднім і наступним символами, якщо це не літери чи цифри. Тоді ваша підстановка може бути такою:

$1$2$3

Нею буде замінено весь знайдений за шаблоном рядок. Ми починаємо заміну з першого знайденого символу (який не буква і цифра), відзначаючи його $1 . Без цього ми просто видалили б цей символ з тексту. Те саме стосується кінця підстановки ($3). У середину ми додали HTML тегдля жирного зображення (зрозуміло, замість нього ви можете використовувати CSS або ), виділивши їм другу групу, знайдену за шаблоном ($2).

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

Регулярний вираз – це об'єкт, що описує символьний шаблон. Клас RegExp в JavaScript представляє регулярні вирази, а об'єкти класів String і RegExp визначають методи, що використовують регулярні вирази для пошуку за шаблоном і операцій пошуку в тексті із заміною. Граматика регулярних виразів у мовою JavaScriptмістить досить повне підмножина синтаксису регулярних виразів, що використовується в мові Perl 5, тому, якщо ви маєте досвід роботи з мовою Perl, то ви легко зможете описувати шаблони в програмах на мові JavaScript.

До особливостей регулярних виразів мови Perl, які не підтримуються в ECMAScript, входять прапори s (однорядковий режим) та x (розширений синтаксис); керуючі послідовності \a, \e, \l, \u, \L, \U, \E, \Q, \A, \Z, \z і \G та інші розширені конструкції, що починаються з (?.

Визначення регулярних виразів

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

Var pattern = / s $ /;

Цей рядок створює новий об'єкт RegExp і привласнює його змінної pattern. Цей об'єкт RegExp шукає будь-які рядки, що закінчуються символом "s". Цей же регулярний вираз може бути визначений за допомогою конструктора RegExp():

Var pattern = новий RegExp("s$");

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

Інші символи в регулярних виразах не призначені для пошуку їх точних еквівалентів, а мають особливе значення. Наприклад, регулярний вираз /s$/ містить два символи. Перший символ s означає пошук буквального символу. Другий, $ - це спеціальний метасимвол, що означає кінець рядка. Таким чином, цей регулярний вираз відповідає будь-якому рядку, що закінчується символом s.

У наступних розділах описано різні символи та метасимволи, які використовуються у регулярних виразах у мові JavaScript.

Символи літералів

Як зазначалося раніше, всі алфавітні символи та цифри у регулярних виразах відповідають самі собі. Синтаксис регулярних виразів JavaScript також підтримує можливість вказувати деякі неалфавітні символи за допомогою керуючих послідовностей, що починаються з символу зворотного слеша (\). Наприклад, послідовність \n відповідає символу перекладу рядка. Ці символи наведені в таблиці нижче:

Деякі розділові знаки мають у регулярних виразах особливий зміст:

^ $ . * + ? = ! : | \ / () { } -

Значення цих символів розкривається у наступних розділах. Деякі з них мають особливе значення лише у певних контекстах регулярних виразів, а інших контекстах трактуються буквально. Однак, як правило, щоб включити якийсь із цих символів у регулярне вираз буквально, необхідно помістити перед ним символ зворотного слеша. Інші символи, такі як лапки та @, не мають спеціального значення і просто відповідають у регулярних виразах самим собі.

Якщо ви не можете точно згадати, яким із символів повинен передувати символ \, можете спокійно поміщати зворотний слеш перед будь-яким символом. Однак майте на увазі, що багато літер і цифр разом із символом слеша набувають спеціального значення, тому тим буквам і цифрам, які ви шукаєте буквально, не повинен передувати символ \. Щоб увімкнути в регулярне вираз сам символ зворотного слеша, перед ним, очевидно, слід помістити інший символ зворотного слеша. Наприклад, наступне регулярне вираз відповідає будь-якому рядку, що містить символ зворотного слеша: /\\/.

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

Окремі символи літералів можуть об'єднуватись у класи символів шляхом поміщення їх у квадратні дужки. Клас символів відповідає будь-якому символу, що міститься у цьому класі. Отже, регулярне вираз // відповідає одному із символів a, b або c.

Можуть також визначатися класи символів із запереченням, що відповідають будь-якому символу, крім тих, що вказані у дужках. Клас символів із запереченням задається символом ^ як перший символ, що йде за лівою дужкою. Регулярний вираз /[^abc]/ відповідає будь-якому символу, відмінному від a, b або c. У класах символів діапазон символів може задаватися дефісом. Пошук усіх символів латинського алфавітув нижньому регістріздійснюється за допомогою виразу //, а будь-яку букву чи цифру з набору символів Latin можна знайти за допомогою виразу //.

Деякі класи символів використовуються особливо часто, тому синтаксис регулярних виразів JavaScript включає спеціальні символи і керуючі (escape) послідовності для їх позначення. Так, \s відповідає символам пробілу, табуляції та будь-яким пробіловим символам з набору Unicode, а \S - будь-яким символам, які не є пробіловими символами з набору Unicode.

У таблиці нижче наводиться перелік цих спецсимволів та синтаксису класів символів. (Зверніть увагу, що деякі з керуючих послідовностей класів символів відповідають тільки ASCII-символам і не розширені для роботи з Unicode-символами. Можна явно визначити власні класи Unicode-символів, наприклад, вираз /[\u0400-\u04FF]/ відповідає будь-якому символу кирилиці.)

Класи символів регулярних виразів JavaScript Символ Відповідність
[...] Будь-який із символів, вказаних у дужках
[^...] Будь-який із символів, не вказаних у дужках
. Будь-який символ, окрім перекладу рядка або іншого роздільника Unicode-рядка
\w Будь-який текстовий ASCII символ. Еквівалентно
\W Будь-який символ, що не є текстовим символом ASCII. Еквівалентно [^a-zA-Z0-9_]
\s Будь-який символ пробілу з набору Unicode
\S Будь-який непробілний символ із набору Unicode. Зверніть увагу, що символи \w і \S - це не те саме
\d Будь-які ASCII-цифри. Еквівалентно
\D Будь-який символ відмінний від ASCII-цифр. Еквівалентно [^0-9]
[\b] Літерал символу «забій»

Зверніть увагу, що керуючі послідовності спеціальних символів класів можуть бути у квадратних дужках. \s відповідає будь-якому символу пробілу, а \d відповідає будь-якій цифрі, отже, /[\s\d]/ відповідає будь-якому символу або цифрі.

Повторення

Маючи знання синтаксису регулярних виразів, отримані на даний момент, ми можемо описати число з двох цифр як /d/d або з чотирьох цифр як /dd, але не зможемо, наприклад, описати число, що складається з будь-якої кількості цифр, або рядок з трьох букв, за якими слідує необов'язкова цифра. Ці складніші шаблони використовують синтаксис регулярних виразів, що вказує, скільки разів може повторюватися даний елементрегулярного вираження.

Символи, що позначають повторення, завжди йдуть за шаблоном, до якого вони використовуються. Деякі види повторень використовуються досить часто і для позначення цих випадків є спеціальні символи. Наприклад, + відповідає одному або декільком екземплярам попереднього шаблону. У наступній таблиці наведено зведення синтаксису повторень:

Наступні рядки демонструють кілька прикладів:

Var pattern = / d (2,4) /; // Відповідає числу, що містить від двох до чотирьох цифр pattern = / w (3) d? /; // Відповідає точно трьом символам слова та одній необов'язковій цифрі pattern = /\s+java\s+/; // Відповідає слову "java" з одним або більше пробілами // до і після нього pattern = /[^(]*/; // Відповідає нулю або більше символам, відмінним від круглої дужки, що відкриває

Будьте уважні, використовуючи символи повторення * і?. Вони можуть відповідати відсутності вказаного перед ними шаблону і, отже, відсутності символів. Наприклад, регулярному виразу /a*/ відповідає рядок "bbbb", оскільки в ньому немає символу a.

Символи повторення, перелічені у таблиці, відповідають максимально можливої ​​кількості повторень, у якому забезпечується пошук наступних частин регулярного висловлювання. Ми говоримо, що це – «жадібне» повторення. Є також можливість реалізувати повторення, яке виконується «нежадібним» способом. Достатньо вказати після символу (або символів) повторення знак запитання: ??, +?, *? або навіть (1,5)?

Наприклад, регулярне вираження /a+/ відповідає одному або більше екземплярам літери a. Застосоване до рядка "aaa", воно відповідає всім трьом буквам. З іншого боку, вираз /a+?/ відповідає одному чи більше екземплярам літери a і вибирає найменш можливе число символів. Застосований до того ж рядка, цей шаблон відповідає лише першій літері a.

«Нежадібне» повторення не завжди дає очікуваний результат. Розглянемо шаблон /a+b/, який відповідає одному або більше символам a, за якими слідує символ b. Стосовно рядка «aaab» йому відповідає весь рядок.

Тепер перевіримо «нежадібну» версію /a+?b/. Можна було б подумати, що вона повинна відповідати символу b, перед яким стоїть лише один символ a. У разі застосування до того ж рядка «aaab» можна було б очікувати, що вона збігається з єдиним символом і останнім символом b. Однак насправді цьому шаблону відповідає весь рядок, як і у разі «жадібної» версії. Справа в тому, що пошук за шаблоном регулярного виразу виконується шляхом знаходження першої позиції в рядку, починаючи з якого відповідність стає можливою. Оскільки відповідність можлива, починаючи з першого символу рядка, коротші відповідності, що починаються з наступних символів, навіть не розглядаються.

Альтернативи, угруповання та посилання

Граматика регулярних виразів включає спеціальні символи визначення альтернатив, виразів угруповання та посилань на попередні вирази. Символ вертикальної межі | служить поділу альтернатив. Наприклад, /ab|cd|ef/ відповідає або рядку «ab», або рядку «cd», або рядку «ef», а шаблон /\d(3)|(4)/ - або трьох цифр, або чотирьох рядкових букв .

Зверніть увагу, що альтернативи обробляються зліва направо доти, доки знайдено відповідність. При виявленні збігу з лівою альтернативою права ігнорується, навіть якщо можна досягти «кращої» відповідності. Тому, коли до рядка «ab» застосовується шаблон /a|ab/, він відповідатиме лише першому символу.

Круглі дужки мають у регулярних виразах кілька значень. Одне з них – угруповання окремих елементівв один подвыражение, отже елементи під час використання спеціальних символів |, *, +, ? та інших розглядаються як одне ціле. Наприклад, шаблон /java(script)?/ відповідає слову «java», за яким слідує необов'язкове слово «script», а /(ab|cd)+|ef)/ відповідає або рядку «ef», або одному або більше повторень однієї з рядків "ab" або "cd".

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

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

З цим пов'язане ще одне застосування виразів у дужках, що дозволяє посилатися на вирази з попередньої частини того ж регулярного виразу. Це досягається шляхом вказівки однієї чи кількох цифр після символу \. Цифри посилаються на позицію виразу в дужках усередині регулярного виразу. Наприклад, \1 посилається на перший подвиражение, а \3 - на третє. Зверніть увагу, що вирази можуть бути вкладені одне в інше, тому при підрахунку використовується позиція лівої дужки. Наприклад, у наступному регулярному виразі посилання на вкладене вираз (cript) буде виглядати як \2:

/(ava(cript)?)\sis\s(fun\w*)/

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

/[""][^""]*[""]/

Відповідності лапок ми можемо вимагати за допомогою такого посилання:

Тут \1 відповідає збігу з першим виразом. У цьому прикладі посилання накладає обмеження, що вимагає, щоб лапка, що закриває, відповідала відкриває. Цей регулярний вираз не допускає присутності одинарних лапок усередині подвійних, і навпаки.

Можливе також угрупування елементів у регулярному виразі без створення нумерованого посилання на ці елементи. Замість простого групування елементів між (і) почніть групу із символів (?: і закінчіть її символом). Розглянемо, наприклад, наступний шаблон:

/(ava(?:cript)?)\sis\s(fun\w*)/

Тут вираз (?:cript) необхідний лише для угруповання, щоб до групи міг бути застосований символ повторення?. Ці модифіковані дужки не створюють посилання, тому в даному регулярному виразі \2 посилається на текст, що відповідає шаблону (fun\w*).

У наступній таблиці наводиться перелік операторів вибору з альтернатив, групування та посилання у регулярних виразах:

Символи регулярних виразів вибору з альтернатив, угруповання та посилання JavaScriptСимвол Значення
| Альтернатива. Відповідає або подвыражению зліва, або подвыражению справа.
(...) Угруповання. Групує елементи в єдине ціле, яке можна використовувати з символами *, +, ?, | і т.п. Також запам'ятовує символи, які відповідають цій групі для використання у наступних посиланнях.
(?:...) Лише угруповання. Групує елементи у єдине ціле, але не запам'ятовує символи, що відповідають цій групі.
\number Відповідає тим же символам, які були знайдені у порівнянні з групою номером number. Групи - це подвыражения всередині дужок (можливо вкладених). Номери груп присвоюються шляхом підрахунку лівих дужок зліва направо. Групи, сформовані за допомогою символів (?:), не нумеруються.
Вказівка ​​позиції відповідності

Як описано раніше, багато елементів регулярного виразу відповідають одному символу в рядку. Наприклад, \s відповідає одному символу пробілу. Інші елементи регулярних виразів відповідають позиціям між символами, а чи не самим символам. Наприклад, \b відповідає межі слова - межі між \w (текстовий ASCII-символ) і \W (нетекстовий символ) або межі між текстовим ASCII-символом і початком або кінцем рядка.

Такі елементи, як \b, не визначають будь-які символи, які мають бути присутніми у знайденому рядку, однак вони визначають допустимі позиції для перевірки відповідності. Іноді ці елементи називаються якірними елементами регулярних виразів, тому що вони закріплюють шаблон за певною позицією рядка. Найчастіше використовуються такі якірні елементи, як ^ і $, що прив'язують шаблони відповідно до початку та кінця рядка.

Наприклад, слово "JavaScript", що знаходиться на окремому рядку, можна знайти за допомогою регулярного виразу /^JavaScript$/. Щоб знайти окреме слово «Java» (а не префікс, наприклад, у слові «JavaScript»), можна спробувати застосувати шаблон /\sJava\s/, який вимагає наявності пробілу до і після слова.

Але таке рішення породжує дві проблеми. По-перше, воно знайде слово Java, тільки якщо воно оточене пробілами з обох сторін, і не зможе знайти його на початку або в кінці рядка. По-друге, коли цей шаблон дійсно знайде відповідність, рядок, що їм повертається, міститиме провідні і замикаючі прогалини, а це не зовсім те, що нам потрібно. Тому замість шаблону, що збігається з пробіловими символами \s, ми скористаємося шаблоном (або якорем), що збігається з межами слова \b. Вийде наступне вираз: / Java Java.

Якірний елемент відповідає позиції, яка не є межею слова. Тобто шаблону /\Bcript/ відповідатимуть слова «JavaScript» і «postscript» і відповідати слова «script» чи «Scripting».

Як якірних умов можуть також виступати довільні регулярні висловлювання. Якщо помістити вираз між символами (?= і), воно перетвориться на випереджувальну перевірку на збіг з наступними символами, яка вимагає, щоб ці символи відповідали вказаному шаблону, але не включалися до рядка відповідності.

Наприклад, щоб знайти збіг з назвою поширеної мови програмування, за яким слідує двокрапка, можна скористатися виразом /ava(cript)?(?=\:)/. Цьому шаблону відповідає слово "JavaScript" у рядку "JavaScript: The Definitive Guide", але йому не відповідатиме слово "Java" у рядку "Java in a Nutshell", тому що за ним не слідує двокрапка.

Якщо ж ввести умову (?!, то це буде негативна випереджувальна перевірка на наступні символи, що вимагатиме, щоб наступні символи не відповідали вказаному шаблону. Наприклад, шаблону /Java(?!Script)(\w*)/ відповідає підрядок «Java», за якою слідує заголовна літера і будь-яка кількість текстових ASCII-символів за умови, що за підрядком «Java» не слідує підрядок «Script», він збігається з рядком «JavaBeans», але не збігається з рядком «Javanese», збігається з рядком «JavaScrip », але не збігається з рядками JavaScript або JavaScripter.

У таблиці нижче наводиться перелік якірних символів регулярних виразів:

Якірні символи регулярних виразів Символ Значення
^ Відповідає початку рядкового виразу або початку рядка при багатостроковому пошуку.
$ Відповідає кінцю рядкового виразу або кінцю рядка при багатостроковому пошуку.
\b відповідає межі слова, тобто. відповідає позиції між символом \w та символом \W або між символом \w та початком або кінцем рядка. (Однак зверніть увагу, що [\b] відповідає символу забою.)
\B Відповідає позиції, яка не є межею слів.
(? = p) Позитивна випереджувальна перевірка наступні символи. Потрібно, щоб наступні символи відповідали шаблону p, але ці символи не входять у знайдений рядок.
(?! p) Негативна випереджувальна перевірка наступних символів. Потрібно, щоб наступні символи не відповідали шаблону p.
Прапори

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

Прапор iвказує, що пошук за шаблоном має бути нечутливим до регістру символів, а прапор g- що пошук може бути глобальним, тобто. повинні бути знайдені всі відповідності у рядку. Прапор mвиконує пошук за шаблоном у багаторядковому режимі. Якщо рядковий вираз, в якому виконується пошук, містить символи перекладу рядків, то в цьому режимі якірні символи ^ і $, крім того, що вони відповідають початку та кінцю всього строкового виразу, також відповідають початку та кінцю кожної текстового рядка. Наприклад, шаблону /java$/im відповідає як слово java, так і Java nis fun.

Ці прапори можуть поєднуватися в будь-які комбінації. Наприклад, щоб виконати пошук першого входження слова "java" (або "Java", "JAVA" і т.д.) без урахування регістру символів, можна скористатися нечутливим до регістру регулярним виразом /\bjava\b/i. А щоб знайти всі входження цього слова в рядку, можна додати прапор g: /bjavab/gi.

Методи класу Stringдля пошуку за шаблоном

До цього моменту ми обговорювали граматику створюваних регулярних виразів, але не розглядали, як ці регулярні вирази можуть фактично використовуватись у JavaScript-сценаріях. У даному розділіми обговоримо методи об'єкта String, у яких регулярні висловлювання використовуються для пошуку за шаблоном, а також для пошуку із заміною. А потім продовжимо розмову про пошук за шаблоном з регулярними виразами, розглянувши об'єкт RegExp, його методи та властивості.

Рядки підтримують чотири методи, що використовують регулярні вирази. Найпростіший їх - метод search() . Він приймає як аргумент регулярне вираження і повертає або позицію першого символу знайденого підрядка, або -1, якщо відповідність не знайдено. Наприклад, наступний виклик поверне 4:

Var result = "JavaScript".search(/script/i); // 4

Якщо аргумент методу search() є регулярним виразом, він спочатку перетворюється шляхом передачі конструктору RegExp. Метод search() не підтримує глобальний пошук та ігнорує прапор g у своєму аргументі.

Метод replace() виконує операцію пошуку із заміною. Він приймає як перший аргумент регулярне вираження, а як другий - рядок заміни. Метод шукає у рядку, на яку він викликаний, відповідність зазначеному шаблону.

Якщо регулярне вираз містить прапор g, метод replace() замінює всі знайдені збіги рядком заміни. Інакше він замінює лише перший знайдений збіг. Якщо перший аргумент методу replace() є рядком, а чи не регулярним виразом, то метод виконує буквальний пошук рядка, а чи не перетворює їх у регулярне вираження з допомогою конструктора RegExp(), як це робить метод search().

Як приклад ми можемо скористатися методом replace() для одноманітного розміщення великих літеру слові «JavaScript» для всього рядка тексту:

// Незалежно від регістру символів замінюємо словом у потрібному регістрі var result = "javascript".replace(/JavaScript/ig, "JavaScript");

Метод replace() є більш потужний засіб, Чим можна було б припустити за цим прикладом. Нагадаю, що вирази в дужках, що знаходяться всередині регулярного виразу, нумеруються зліва направо, і що регулярне вираз запам'ятовує текст, який відповідає кожному з виразів. Якщо в рядку заміни є знак $ з цифрою, метод replace() замінює ці два символи текстом, що відповідає вказаному виразу. Це дуже корисна можливість. Ми можемо використовувати її, наприклад, для заміни прямих лапок у рядку типографськими лапками, які імітуються ASCII-символами:

// Цитата - це лапка, за якою слідує будь-яке число символів, // відмінних від лапок (їх ми запам'ятовуємо), за цими символами // слідує ще одна лапка var quote = /"([^"]*)"/g; // Замінюємо прямі лапки друкарськими і залишаємо без змін «$1» // вміст цитати, що зберігається в $1 var text = ""JavaScript" - мова програмування, що інтерпретується."; // «JavaScript» - інтерпретована мова програмування.

Важливе, що слід зазначити - другий аргумент replace() може бути функцією, що динамічно обчислює рядок заміни.

Метод match() - це найбільш загальний методів класу String, використовують регулярні висловлювання. Він приймає як єдиний аргумент регулярне вираз (або перетворює свій аргумент на регулярне вираження, передавши його конструктору RegExp()) і повертає масив, що містить результати пошуку. Якщо у регулярному виразі встановлено прапор g, метод повертає масив усіх відповідностей, що є у рядку. Наприклад:

// поверне ["1", "2", "3"] var result = "1 плюс 2 і 3".match(/d+/g);

Якщо регулярний вираз не містить прапора g, метод match() не виконує глобальний пошук; він просто шукає перший збіг. Однак match() повертає масив, навіть коли метод не виконує глобального пошуку. У цьому випадку перший елемент масиву - це знайдена підрядка, а всі елементи, що залишилися, являють собою подвыражения регулярного висловлювання. Тому якщо match() повертає масив arr, то arr міститиме знайдений рядок цілком, arr -підрядок, що відповідає першому виразу, і т.д. Проводячи паралель з методом replace(), можна сказати, що arr[n] заноситься вміст $n.

Наприклад, погляньте на наступний програмний код, що виконує розбір URL-адреси:

Var url = /(\w+):\/\/([\w.]+)\/(\S*)/; var text = "Відвідайте наш сайт http://www.php"; var result = text.match(url); if (result != null) ( var fullurl = result; // Містить "http://www..php" var protocol = result; // Містить "http" var host = result; // Містить "www..php )

Слід зазначити, що для регулярного виразу, в якому не встановлено прапор g глобального пошуку, метод match() повертає те саме значення, як і метод exec() регулярного висловлювання: повертається масив має властивості index і input, як у обговоренні методу exec() нижче.

Останній із методів об'єкта String, у якому використовуються регулярні вирази - split() . Цей метод розбиває рядок, на яку він викликаний, на масив підрядків, використовуючи аргумент як роздільника. Наприклад:

"123,456,789".split(","); // Поверне ["123","456","789"]

Метод split() може також приймати як аргумент регулярне вираження. Це робить метод сильнішим. Наприклад, можна вказати роздільник, який допускає довільне числопробілових символів з обох боків:

"1, 2, 3, 4, 5".split(/\s*,\s*/); // Поверне ["1","2","3","4","5"]

Об'єкт RegExp

Як згадувалося, регулярні висловлювання представлені як об'єктів RegExp. Крім конструктора RegExp(), об'єкти RegExp підтримують три методи та кілька властивостей.

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

Другий аргумент RegExp() може бути відсутнім. Якщо його вказано, то визначає прапори регулярного вираження. Це може бути одне із знаків g, i, m чи комбінація цих символів. Наприклад:

// Знаходить усі п'ятизначні числа у рядку. Зверніть увагу // на використання в цьому прикладі символів \var zipcode = new RegExp("\d(5)", "g");

Конструктор RegExp() зручно використовувати, коли регулярний вираз створюється динамічно і тому не може бути представлений синтаксисом літералів регулярних виразів. Наприклад, щоб знайти рядок, введений користувачем, треба створити регулярний вираз під час виконання за допомогою RegExp().

Властивості RegExp

Кожен об'єкт RegExp має п'ять властивостей. Властивість source - рядок, доступна лише читання, містить текст регулярного висловлювання. Властивість global - логічне значення, доступне лише читання, визначальне наявність прапора g у регулярному вираженні. Властивість ignoreCase - це логічне значення, доступне тільки для читання, що визначає наявність прапора i в регулярному виразі. Властивість multiline - це логічне значення, доступне лише читання, визначальне наявність прапора m у регулярному вираженні. І остання властивість lastIndex - це ціле число, доступне для читання та запису. Для шаблонів з прапором g ця властивість містить номер позиції у рядку, з якого має бути розпочато наступний пошук. Як описано нижче, воно використовується методами exec() та test().

Методи RegExp

Об'єкти RegExp визначають два методи, що виконують пошук за шаблоном; вони поводяться аналогічно методам класу String, описаним вище. Основний метод класу RegExp, який використовується для пошуку за шаблоном - exec(). Він схожий на згадуваний метод match() класу String, за винятком того, що є методом класу RegExp, що приймає як аргумент рядок, а не методом класу String, що приймає аргумент RegExp.

Метод exec() виконує регулярне вираз для зазначеного рядка, тобто. шукає збіг у рядку. Якщо збіг не виявлено, метод повертає null. Однак якщо знайдено відповідність, він повертає такий же масив, як масив, що повертається методом match() для пошуку без прапора g. Нульовий елемент масиву містить рядок, що відповідає регулярному виразу, а все наступні елементи- Підрядки, що відповідають усім виразам. Крім того, властивість indexмістить номер позиції символу, яким починається відповідний фрагмент, а властивість inputпосилається на рядок, у якому виконувався пошук.

На відміну від match() метод exec() повертає масив, структура якого не залежить від наявності в регулярному вираженні прапора g. Нагадаю, що з передачі глобального регулярного висловлювання метод match() повертає масив знайдених відповідностей. А exec() завжди повертає одну відповідність, але надає про неї повну інформацію. Коли exec() викликається для регулярного виразу, що містить прапор g, метод встановлює властивість lastIndex об'єкта регулярного виразу рівним номеру позиції символу, що йде безпосередньо за знайденим підрядком.

Коли метод exec() викликається для того ж регулярного виразу вдруге, він починає пошук із символу, позиція якого вказана у властивості останньогоіндексу. Якщо exec() не знаходить відповідності, властивість lastIndex отримує значення 0. (Ви також можете встановити lastIndex в нуль у будь-який момент, що слід робити у всіх випадках, коли пошук завершується до того, як буде знайдена остання відповідність в одному рядку, і починається пошук в іншому рядку з тим же об'єктом RegExp.) Ця особлива поведінка дозволяє викликати exec() повторно для перебору всіх відповідностей регулярного виразу в рядку. Наприклад:

Var pattern = / Java / g; var text = "JavaScript - це більш кумедна штука, ніж Java!"; var result; while((result = pattern.exec(text)) != null) ( console.log("Знайдено "" + result + """ + " у позиції " + result.index + "; наступний пошук почнеться з " + pattern .lastIndex);

Ще один метод об'єкта RegExp - test() , який набагато простіше методу exec(). Він приймає рядок і повертає true, якщо рядок відповідає регулярному виразу:

Var pattern = / Java / i; pattern.test("JavaScript"); // Поверне true

Виклик test() еквівалентний виклик exec(), що повертає true, якщо exec() повертає не null. З цієї причини метод test() поводиться так само, як метод exec() при виклику для глобального регулярного виразу: він починає шукати зазначений рядок з позиції, заданої властивістю lastIndex, і якщо знаходить відповідність, встановлює властивість lastIndex рівним номеру позиції символу, безпосередньо наступного за знайденою відповідністю. Тому за допомогою методу test() можна також сформувати цикл обходу рядка, як за допомогою методу exec().

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

Основні поняття

Регулярне вираз (regular expression) - засіб обробки рядків чи послідовність символів, визначальна шаблон тексту.

Модифікатор – призначений для "інструктування" регулярного вираження.

Метасимволи – спеціальні символи, які служать командами мови регулярних виразів.

Регулярний вираз задається як звичайна змінна, тільки замість лапок використовується слеш, наприклад: var reg=/рег_вираз/

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

Припустимо, нашим завданням є заміна всіх букв "р" (малих та великих) на латинську велику букву"R" у словосполученні Регулярні вирази.

Створюємо шаблон var reg=/р/ та скористаючись методом replaceздійснюємо задумане



var reg=/р/

document.write(result)

В результаті отримаємо рядок - РегуляRні вирази, заміна відбулася тільки на першому входженні літери "р" з урахуванням регістру.

Але під умови нашого завдання цей результат не підходить... Тут нам знадобляться модифікатори g і i, які можуть використовуватися як окремо, так і спільно. Ці модифікатори ставляться в кінці шаблону регулярного виразу, після слеша, і мають наступні значення:

модифікатор " g " - ставить пошук у рядку як " глобальний " , тобто. у разі заміна відбудеться всім входжень букви " р " . Тепер шаблон виглядає так: var reg=/р/g, підставивши його в наш код


var str="Регулярні вирази"
var reg=/р/g
var result=str.replace(reg, "R")
document.write(result)

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

модифікатор "i" - задає пошук у рядку без урахування регістру, додавши цей модифікатор до нашого шаблону var reg=/р/gi , після виконання скрипту отримаємо шуканий результат нашого завдання - РегуляRні вирази .

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

Метасимволи задають тип символів рядка, спосіб оточення рядка в тексті, а також кількість символів окремого типуу тексті, що переглядається. Тому метасимволи можна поділити на три групи:

  • Метасимволи пошуку збігів.
  • Кількісні метасимволи.
  • Метасимволи позиціонування.
Метасимволи пошуку збігів

Значення

Опис

межа слова

задає умову, за якої шаблон повинен виконуватися на початку або наприкінці слова

/\ber/ збігається з error, не збігається з heroабо з player
/er/ співпадає з player, не збігається з heroабо з error
/\ber\b/ не збігається з heroабо з playerабо з error, може збігтися тільки з er

не межа слова

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

/\Ber/ збігається з heroабо з player, не збігається з error
/er\B/ збігається з errorабо з player, не збігається з hero
/\Ber\B/ збігається з hero, не збігається з playerабо з error

цифра від 0 до 9

/\d\d\d\d/ збігається з будь-яким значним числом

/\D\D\D\D/ не збігається з 2005 або 05.габо №126 і т.д.

одиночний порожній символ

відповідає символу пропуску

\over\sbyte\ збігається тільки з over byte

одиночний непустий символ

будь-який один символ за винятком пробілу

\over\Sbyte\ збігається з over-byteабо з over_byte, не збігається з over byteабо over--byte

буква, цифра або символ підкреслення

/A\w/ збігається з A1або з AB, не збігається з A+

не буква, цифра або символ підкреслення

/A\W/ не збігається з A1або з AB, Зівпадає з A+

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

будь-які знаки, літери, цифри і т.д.

/.../ збігається з будь-якими трьома символами ABCабо !@4 або 1 q

набір символів

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

/WERTY/ збігається з QWERTY, з AWERTY

набір символів, що не входять

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

/[^QA]WERTY/ не збігається з QWERTY, з AWERTY

Символи, наведені в таблиці "Метасимволи пошуку збігів" не треба плутати з послідовністю знаків переходу використовуваних у рядках, таких як t - табуляція, n - перехід на новий рядок і т.д.

Кількісні метасимволи

Кількість збігів

Нуль та Велика кількістьраз

/Ja*vaScript/ збігається з JvaScriptабо з JaavaScriptабо з JaaavaScript, не збігається з JovaScript

Нуль чи один раз

/Ja?vaScript/ збігається тільки з JvaScriptабо з JavaScript

Один і більше разів

/Ja+vaScript/ збігається з JavaScriptабо з JaavaScriptабо з JaaavaScript, не збігається з JvaScript

точно n раз

/Ja(2)vaScript/ збігається тільки з JaavaScript

n або більше разів

/Ja(2,)vaScript/ збігається з JaavaScriptабо з JaaavaScript, не збігається з JvaScriptабо з JavaScript

по Крайній мірі, n разів, але не більше ніж m разів

/Ja(2,3)vaScript/ збігається тільки з JaavaScriptабо з JaaavaScript

Кожен символ, наведений у таблиці "Кількісні метасимволи", застосовується до одного попереднього символу або метасимволу в регулярному виразі.

Метасимволи позиціонування

Останній набірметасимволів призначений для позначення, де шукати (якщо це важливо) підрядок на початку рядка або наприкінці.

Деякі методи роботи з шаблонами

replace - даний методми вже використовували на самому початку статті, він призначений для пошуку зразка та заміни знайденого підрядка на новий підрядок.

exec - цей метод виконує зіставлення рядка із зразком, заданим шаблоном. Якщо зіставлення із зразком закінчилося невдачею, то повертається значення null. В іншому випадку результатом є масив підрядків, що відповідають заданому зразку. /*Перший елемент масиву дорівнюватиме вихідному рядку, що відповідає заданому шаблону*/

наприклад:


var reg=/(d+).(d+).(d+)/
var arr=reg.exec("Я народився 15.09.1980")
document.write("Дата народження: ", arr, "< br>")
document.write("День народження: ", arr, "< br>")
document.write("Місяць народження: ", arr, "< br>")
document.write("Рік народження: ", arr, "< br>")

в результаті отримаємо чотири рядки:
Дата народження: 15.09.1980
День народження: 15
Місяць народження: 09
Рік народження: 1980

Висновок

У статті відображено далеко не всі можливості та принади регулярних виразів, для глибшого вивчення цього питання пораджу вивчити об'єкт RegExp. Також хочу звернути увагу на те, що синтаксис регулярних виразів нічим не відрізняється як у JavaScript, так і в PHP. Наприклад, для перевірки правильності введення e-mail, регулярне вираження, що для JavaScript, що для PHP виглядатиме однаково /+@+.(2,3)/i .

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

Синтаксис // за допомогою спеціального синтаксису літералів var regex = / pattern / flags; // за допомогою конструктора var regex = new RegExp ("pattern", "flags"); var regex = new RegExp(/pattern/, "flags");

Значення параметрів:

Прапори регулярних виразів Прапор Опис
gДозволяє знайти всі збіги, а не зупинятися після першого збігу ( global match flag).
iДозволяє виконати зіставлення без урахування регістру ( ignore case flag).
mЗіставлення здійснюється за кількома рядками. Обробка початкових і кінцевих символів (^ і $) проводиться за кількома рядками, тобто зіставлення відбувається з початком або кінцем кожного рядка (розділювачі \n або \r), а не тільки з початком, або кінцем всього рядка ( multiline flag).
uШаблон буде розцінений як послідовність кодових точок Юнікоду ( unicode flag).
yЗіставлення відбувається за індексом на який вказує властивість останнього індексу цього регулярного виразу, при цьому зіставлення не проводиться за пізнішим, або раннім індексом ( sticky flag).
Набори символів Метасимволи Символ Опис
. Дозволяє знайти один символ, крім символу нового рядка, або символу кінця рядка (n, r, 2028 або 2029).
\dДозволяє знайти символ цифри у базовому латинському алфавіті. Еквівалентин використання набору символів.
\DДозволяє знайти будь-який символ, який не є цифрою у базовому латинському алфавіті. Еквівалентний набору символів [^0-9].
\sДозволяє знайти одиночний символ пробілу. Під пробіловим символом розуміється пробіл, табуляція, переклад сторінки, переклад рядка та інші пробільні символиЮнікод. Еквівалентний набору символів. \u2028\u202f\u205f\u3000].
\SДозволяє знайти одиночний символ, який не є пробільним. Під пробіловим символом розуміється пробіл, табуляція, переклад сторінки, переклад рядка та інші символи пробілу Юнікоду. Еквівалентний набору символів. '\u2028\u2029\u202fu3000].
[\b]Дозволяє знайти символ backspace (спеціальний символ \b, U+0008).
\0 Дозволяє знайти символ 0 (нуль).
\nДозволяє знайти символ нового рядка.
\fДозволяє знайти символ перекладу сторінки.
\rДозволяє знайти символ повернення каретки.
\tДозволяє знайти символ горизонтальної табуляції.
\vДозволяє знайти символ вертикальної табуляції.
\wДозволяє знайти будь-який буквено-цифровий символ базового латинського алфавіту, включаючи підкреслення. Еквівалентний набору символів.
\WДозволяє знайти будь-який символ, який не є символом базового латинського алфавіту. Еквівалентний набору символів [^a-Za-z0-9_].
\cXДозволяє знайти контрольний символ у рядку. Де X - буква від A до Z. Наприклад, /\cM/ означає символ Ctrl-M.
\xhhДозволяє знайти символ, використовуючи шістнадцяткове значення(hh - двозначне шістнадцяткове значення).
\uhhhhДозволяє знайти символ, використовуючи кодування UTF-16 (hhhh - чотиризначне шістнадцяткове значення).
\u(hhhh) або
\u(hhhhh)
Дозволяє знайти символ із значенням Юнікоду U+hhhh або U+hhhhh (шістнадцяткове значення). Тільки коли встановлено прапор u .
\ Вказує, що наступний символ є спеціальним і не повинен інтерпретуватись буквально. Для символів, які зазвичай трактуються спеціальним чином, вказує на те, що наступний символ не є спеціальним і повинен інтерпретуватися буквально.
Обмеження Квантифікатори Символ Опис
n*Зіставлення відбувається з будь-яким рядком, що містить нуль або більше входжень символу n.
n+Зіставлення відбувається з будь-яким рядком, що містить хоча б один символ n.
n?Зіставлення відбувається з будь-яким рядком з попереднім елементом nнуль чи один раз.
n(x)Відповідає будь-якому рядку, що містить послідовність символів nкілька разів x. X
n(x,) xвходжень попереднього елемента n. Xмає бути цілим позитивним числом.
n(x, y)Відповідає будь-якому рядку, що містить принаймні x, але не більше, ніж з yвходженнями попереднього елемента n. Xі yмають бути цілими позитивними числами.
n*?
n+?
n??
n(x)?
n(x,)?
n(x, y)?
Зіставлення відбувається за аналогією з квантифікаторами *, +, ? і (...), проте при цьому пошук йдемінімально можливого зіставлення. За замовчуванням використовується "жадібний" режим, ? в кінці квантифікатора дозволяє задати "нежадібний" режим при якому повторення зіставлення відбувається мінімально можливу кількість разів.
x(?=y)Дозволяє зіставити x, тільки якщо за xслід y.
x(?!y)Дозволяє зіставити x, тільки якщо за xне слід y.
x|yЗіставлення відбувається з будь-якою із зазначених альтернатив.
Угруповання та зворотні посилання Символ Опис
(x)Дозволяє знайти символ xі запам'ятати результат зіставлення ("захоплюючі дужки"). Зіставлений підрядок може бути викликаний з елементів результуючого масиву ..., [n], або з властивостей зумовленого об'єкта RegExp $1 ..., $9.
(?:x)Дозволяє знайти символ x, але не запам'ятовувати результат зіставлення ("незахоплюючі дужки"). Зіставлений підрядок не може бути викликаний елементами результуючого масиву ..., [n], або з властивостей зумовленого об'єкта RegExp $1 ..., $9.
\nЗворотне посилання на останній підрядок, що збігається з n-ою за рахунком у круглих дужках у регулярному вираженні (нумерація дужок йде зліва направо). nмає бути цілим позитивним числом.