Js входження підрядки. Методи JavaScript для роботи з рядками. Вбудований об'єкт String

У 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 параметрів містять збіги з вкладених дужок. Останні два параметри - позиція в рядку, на якому відбувся збіг і сам рядок.

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

Символ «мінус» (-) мер модифікатором (за винятком 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 aa a кінець рядка
\A\Aaa aa aaa
aaa aaa
початок тексту
\za\zaaa aaa
aaa aa a
кінець тексту
\ba\b
\ba
aa a aa a
a aa a aa
межа слова, твердження: попередній символ словесний, а наступний - ні, або навпаки
\B\Ba\Ba a a a a 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).

Модифікатори шаблонів

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

Регулярні вирази в Perl обрамляються одним і тим самим символом на початку та наприкінці. Це може бути будь-який символ (частіше використовується «/»), і виглядає так:

/pattern/

Модифікатори додаються до кінця цього рядка, ось так:

/pattern/i

Мета-символи

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

Шпаргалка є загальним посібником за шаблонами регулярних виразів без урахування специфіки будь-якої мови. Вона представлена ​​у вигляді таблиці, що міститься на одному друкованому листі формату A4. Створена під ліцензією Creative Commons на базі шпаргалки, автором якої є Dave Child. Завантажити у PDF, PNG.


JavaScript regexp – це тип об'єкта, який використовується для порівняння послідовності символів у рядках.

Створюємо перший регулярний вираз

Існує два способи створення регулярного виразу: з використанням літералу регулярного виразу або за допомогою конструктора регулярних виразів. Кожен з них представляє той самий шаблон: символ « c», за яким слідує « a», а потім символ « t».

// літерал регулярного виразу полягає у слеші (/) var option1 = /cat/; // Конструктор регулярного виразу var option2 = New RegExp ("cat");

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

Метод RegExp.prototype.test()

Пам'ятаєте, я казав, що регулярні висловлювання є об'єктами? Це означає, що вони мають низку методів. Найпростіший метод – це JavaScript regexp test, який повертає логічне значення:

True (істина): рядок містить шаблон регулярного виразу.

False (брехня): збігу не знайдено.

console.log(/cat/.test(“the cat says meow”)); // вірно console.log(/cat/.test("the dog says bark")); // неправильно

Пам'ятка з основ регулярних виразів

Секрет регулярних виразів полягає у запам'ятовуванні типових символів та груп. Я наполегливо рекомендую витратити кілька годин на таблицю, наведену нижче, а потім повернутися і продовжити вивчення.

Символи

  • . – (точка) відповідає будь-якому одиночному символу за винятком перенесення рядка;
  • *  –  відповідає попередньому виразу, який повторюється 0 або більше разів;
  • +  –  відповідає попередньому виразу, який повторюється 1 або більше разів;
  • ? –  попередній вираз є необов'язковим ( відповідає 0 або 1 раз);
  • ^ - відповідає початку рядка;
  • $ - відповідає кінцю рядка.

Групи символів

  • d– відповідає будь-якому одиночному цифровому символу.
  • w– відповідає будь-якому символу (цифрі, літері або знаку підкреслення).
  • [XYZ]–  набір символів. Відповідає будь-якому символу з набору, заданого в дужках. Також можна задавати діапазони символів, наприклад, .
  • [XYZ ]+– відповідає символу з набору, повторюваного один або більше разів.
  • [^A-Z]–  всередині набору символів "^" використовується як знак заперечення. У цьому прикладі шаблону відповідає все, що не є літерами у верхньому регістрі.

Прапори :

У JavaScript regexp існує п'ять необов'язкових прапорів. Вони можуть використовуватися окремо або разом, та розміщуються після закриває слеша. Наприклад: /[ A-Z] / g. Тут я наведу лише два прапори.

g-   глобальний пошук.

i- Пошук, нечутливий до регістру.

Додаткові конструкції

(x)–   захоплюючі дужки. Цей вираз відповідає x і запам'ятовує цю відповідність, тому ним можна скористатися пізніше.

(?:x)- Незахоплюючі дужки. Вираз відповідає x , але це запам'ятовує відповідність.

Відповідає x, тільки якщо за ним слідує y.

Протестуємо вивчений матеріал

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

console.log(/d/.test("12-34")); // вірно

Наведений вище код повертає значення true , якщо у рядку є хоча одна цифра. Що робити, якщо потрібно перевірити рядок на відповідність формату? Можна використовувати кілька символів «d», щоб визначити формат:

console.log(/dd-dd/.test("12-34")); //правильно console.log(/dd-dd/.test("1234")); //невірно

Якщо неважливо, як у JavaScript regexp online йдуть цифри до і після знака "-", можна використовувати символ "+", щоб показати, що шаблон "d" зустрічається один або кілька разів:

console.log(/d+-d+/.test("12-34")); // вірно console.log(/d+-d+/.test("1-234")); // вірно console.log(/d+-d+/.test("-34")); // неправильно

Для простоти можна використовувати дужки, щоб згрупувати вирази. Припустимо, у нас є нявкання кішки, і ми хочемо перевірити відповідність шаблону. meow»(мяу):

console.log(/me+(ow)+w/.test("meeeeowowoww")); // вірно

Тепер розберемося.

m => відповідність одній літері 'm';

e + => відповідність букві "e" один або кілька разів;

(ow) + => відповідність літер «ow» один або кілька разів;

w => відповідність букві 'w';

'm' + 'eeee' + 'owowow' + 'w'.

Коли оператори типу "+" використовуються відразу після дужок, вони впливають на весь вміст дужок.

Оператор «? ». Він зазначає, що попередній символ є необов'язковим. Як ви побачите нижче, обидва тестові приклади повертають значення true , тому що символи «s» позначені як необов'язкові.

console.log(/cats? says?/i.test("the Cat says meow")); //вірно console.log(/cats? says?/i.test("the Cats say meow")); // вірно

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

var slashSearch = ///; var questionSearch = /?/;

  • d– це те саме, що й : кожна конструкція відповідає цифровому символу.
  • w– це те саме, що [ A-Za-z 0-9_]: обидва вирази відповідають будь-якому алфавітно-цифровому символу або підкресленню.

Приклад: додаємо прогалини до рядків, написаних у «верблюжому» стилі

У цьому прикладі ми дуже втомилися від "верблюжого" стилю написання і нам потрібен спосіб додати прогалини між словами. Ось приклад:

removeCc("camelCase") // => повинен повернути "camel Case"

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

Це відповідає символу "C" в "camelCase"

Тепер, як додати пробіл перед "C"?

Нам потрібно використати захоплюючі дужки! Вони дозволяють знайти відповідність і запам'ятати її, щоб використовувати пізніше! Використовуйте захоплюючі дужки, щоб запам'ятати знайдену велику літеру:

Отримати доступ до захопленого значення пізніше можна так:

Вище ми використовуємо $1 для доступу до захопленого значення. До речі, якби у нас було два набори захоплюючих дужок, ми б використали $1 і $2 для посилання на захоплені значення і аналогічно для більшої кількості захоплюючих дужок.

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

Повернемося до поточного завдання. Як ми реалізуємо захоплюючі дужки? За допомогою методу JavaScript regexp replace! Як другий аргумент ми передаємо «$1». Тут важливо використовувати лапки.

function removeCc(str)( return str.replace(/()/g, "$1"); )

Знову подивимось на код. Ми захоплюємо прописну літеру, а потім замінюємо її тією самою літерою. Усередині лапок вставимо пробіл, за яким слідує змінна $1. У результаті отримуємо пропуск після кожної великої літери.

function removeCc(str)( return str.replace(/()/g, " $1"); ) removeCc("camelCase") // "camel Case" removeCc("helloWorldItIsMe") // "hello World It Is Me"

Приклад: видаляємо великі літери

Тепер у нас є рядок з купою непотрібних великих літер. Ви здогадалися, як їх видалити? По-перше, нам потрібно вибрати всі великі літери. Потім використовуємо пошук набору символів за допомогою глобального модифікатора:

Ми знову будемо використовувати метод replace , але як цього разу зробити малий символ?

function lowerCase(str)( return str.replace(//g, ???); )

Підказка: у методі replace () як другий параметр можна вказати функцію.

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

function lowerCase(str)( return str.replace(//g, (u) => u.toLowerCase()); ) lowerCase("camel Case") // "camel case" lowerCase("hello World It Is Me" ) // "hello world it is me"

The RegExpконструктор створює регулярний вираз об'єкта для матчу з текстом.

Для того, щоб ввійти до регулярних expressions, read the Regular Expressions chapter in the JavaScript Guide.

Source для цього interactive example is stored in GitHub repository. Якщо ви знайдете, щоб розширити проектні приклади, повторити clone https://github.com/mdn/interactive-examples і виконати додаткові запити.

Syntax

Literal, constructor, і factory notations є:

/ pattern / flags new RegExp (pattern [, flags]) RegExp (pattern [, flags ])

Parameters

pattern The text of the regular expression; або як ES5, інший RegExp об'єкт або literal (для двох RegExp конструктивні notations тільки). Patterns може включати в себе їх можна зробити як wider range of values ​​than would a literal string. flags

Якщо визначено, flags is a string that contains the flags to add; або якщо об'єкт використовується для тексту, написи string буде замінити будь-яку з цих objects's flags (and lastIndex will be reset to 0) (as of ES2015). що object's flags (and lastIndex value) will be copied over.

flags mai contain any combination of the following characters:

G global match; find all matches rather than stopping after the first match. i ignore case; if u flag is also enabled, use Unicode case folding. m multiline; treat beginning and end characters (^ and $) як працюючий над multiple lines (i.e., match the beginning or end of each line (delimited by \n or \r), не тільки вельми почати або кінець whole input string). s "dotAll"; allows. до матчу Newlines. u Unicode; treat pattern як sequence of Unicode code points. (See also Binary strings). y sticky; матчі тільки з indexу, що встановлені в останнійIndex property of this regular expression in the target string (and does not attempt to match from any later indexes).

Description

Там є два способи створення RegExp object: a literal notation and a constructor.

  • The literal notation"sпараметри включаються між сплесками і не можуть використовувати quotation marks.
  • The constructor function"sПараметри не включаються між slashes, але для використання quotation marks.

Наступні expresions створюють саму regular expression:

/ab+c/i new RegExp(/ab+c/, "i") // literal notation new RegExp("ab+c", "i") // constructor

Літеральна нотація забезпечується з'єднанням з регулярним виразом, коли зйомка є встановлена. Застосування literal notation when the regular expression буде remain constant. Для прикладу, якщо ви використовуєте літературну нотатку, щоб регулювати регулярне визнання, використовуване в прориві, регулярне визнання не буде переоснащено на будь-яку ітерацію.

Конференція регулярного expresion об'єкта, для прикладу, новий RegExp("ab+c") , забезпечує runtime compilation of regular expression. Використовуйте конструктивну функцію, коли ви знайдете регулярний expressions pattern, щоб змінити, або ви не знаєте, що pattern і буде генерувати його з іншого джерела, так як user input.

Starting with ECMAScript 6, новий RegExp(/ab+c/, "i") no longer throws a TypeError("can"t supply flags when constructing one RegExp from another") when the first argument is a RegExp and the second flags argument is present.

При використанні конструктора функцій, normal string escape rules (preceding special characters with \ included in a string) необхідна. Для прикладу, наступне: equivalent:

Let re = /\w+/ let re = new RegExp("\w+")

Properties

RegExp.prototypeДозволяє додаткову інформацію до всіх об'єктів. RegExp.length Встановлення RegExp.length is 2 . get RegExp[@@species]Конференц-функція, що використовується для створення derivated objects. RegExp.lastIndex Index at which to start the next match.

Methods

Global RegExp об'єкт не має методів його свого. Незважаючи на те, що це вносить деякі методи через prototype chain.

RegExp prototype objects and instances

Properties

Examples

За допомогою regular expression to change data format

let str = "#foo#" let regex = /foo/y regex.lastIndex = 1 regex.test(str) // true regex.lastIndex = 5 regex.test(str) // false (lastIndex is taken into account with sticky flag) regex.lastIndex // 0 (reset after match failure)

Regular expression and Unicode characters

Як mentioned above, \w or \W тільки матчі ASCII засновані characters; for example, a z , A to Z , 0 to 9 , and _ .

Для боротьби з іншими мовами так само як Cyrillic or Hebrew, use \u hhhh, де hhhh is the character's Unicode value in hexadecimal. Цей приклад демонструє, як один може бути виділений з Unicode characters from a word.

Let text = "Зразок text російською мовою" let regex = /[\u0400-\u04FF]+/g .lastIndex) // logs "7" let match2 = regex.exec(text) console.log(match2) // logs "на" console.log(regex.lastIndex) // logs "15" // and so on

Extracting sub-domain name з URL

let url = "http://xxx.domain.com" console.log(/[^.]+/.exec(url).substr(7)) // logs "xxx"

Specifications

Specification Status Comment
ECMAScript 3rd Edition (ECMA-262) Standard Initial definition. Implemented JavaScript 1.1.
ECMAScript 5.1 (ECMA-262)
Standard
ECMAScript 2015 (6th Edition, ECMA-262)
Визначення "RegExp" в цій конкретній.
Standard RegExp конструктор не має тривалого дії, коли перший argument є RegExp і другий argument is present. Introduces Unicode and sticky flags.
ECMAScript Latest Draft (ECMA-262)
Визначення "RegExp" в цій конкретній.
Draft

Browser compatibility

Компактність таблиці на цій сторінці генерується з структурованих даних. Якщо ви знайдете, щоб дізнатися про ваші дані, клацніть на https://github.com/mdn/browser-compat-data і пишуть.