RegExp
Об'єкт RegExp (регулярний вираз) використовується для пошуку в тексті збігів за патерном.
Для знайомства з регулярними виразами прочитайте розділ про регулярні вирази в посібнику з JavaScript. Для отримання детальної інформації про синтаксис регулярних виразів прочитайте довідку з регулярних виразів.
Опис
Літеральний запис та конструктор
Є два способи створити об'єкт RegExp: літеральний запис та конструктор.
- Літеральний запис приймає патерн між двома скісними рисками, після якого, після другої риски – необов'язкові позначки.
- Функція-конструктор приймає як перший параметр або рядок, або об'єкт
RegExp, а як другий – рядок необов'язкових позначок.
Наступні три вирази породжують один і той же об'єкт регулярного виразу:
const re = /ab+c/i; // літеральний запис
// АБО
const re = new RegExp("ab+c", "i"); // конструктор з рядковим патерном як першим аргументом
// АБО
const re = new RegExp(/ab+c/, "i"); // конструктор з літералом регулярного виразу першим аргументом
До використання регулярних виразів вони повинні бути скомпільовані. Цей процес дає змогу виконувати пошук збігів ефективніше. Більше про цей процес – у документації дотнет.
Літеральний запис призводить до компіляції регулярного виразу при обчисленні. З іншого боку, конструктор об'єкта RegExp, new RegExp('ab+c'), призводить до компіляції регулярного виразу часу виконання.
Слід передавати першим аргументом в конструктор RegExp() рядок, коли є потреба збудувати регулярний вираз на основі динамічного введення.
Позначки в конструкторі
Вираз new RegExp(/ab+c/, flags) породить новий RegExp, використовуючи код першого параметра і позначки, надані в другому параметрі.
При застосуванні функції-конструктора необхідно враховувати звичні правила екранування рядків (перед спеціальними символами в рядку слід ставити \).
Наприклад, наступні варіанти – еквівалентні:
const re = /\w+/;
// АБО
const re = new RegExp("\\w+");
Особлива обробка регулярних виразів
[!NOTE] Для перевірки того, чи є щось "регулярним виразом", може бути застосована качина типізація. Такий об'єкт не зобов'язаний бути
RegExp!
Частина вбудованих методів обробляє регулярні вирази по-особливому. Вони вирішують, чи є x регулярним виразом, за кілька кроків:
xмусить бути об'єктом (не примітивом).- Якщо
x[Symbol.match]– неundefined, то треба перевірити цю властивість на істинність. - Інакше, якщо
x[Symbol.match]–undefined, перевірити, чи булоxстворено за допомогою конструктораRegExp. (Цей крок повинен траплятися рідко, адже якщоxє об'єктомRegExp, у котрий не втручалися, то він мусить мати властивістьSymbol.match.)
Слід звернути увагу, що в більшості випадків відбудеться перевірка Symbol.match, а тобто:
- Справжній об'єкт
RegExp, значення чиєї властивостіSymbol.matchє хибним, але неundefined(навіть коли все решта на місці, як тоexecі[Symbol.replace]()) може бути використаний так, ніби він не є регулярним виразом. - Не-
RegExpоб'єкт зі властивістюSymbol.matchбуде оброблятися так, ніби він є регулярним виразом.
Так було вирішено через те, що властивість [Symbol.match]() є найбільш показовою ознакою того, що щось створено для пошуку збігів. (exec також могла бути використана, але через те, що це не символьна властивість, було б забагато помилкових спрацювань.) Серед місць, що обробляють регулярні вирази по-особливому:
String.prototype.endsWith(),startsWith()таincludes()викидаютьTypeError, якщо перший аргумент є регулярним виразом.String.prototype.matchAll()іreplaceAll()перевіряють, чи має регулярний вираз позначку глобальності, якщо перший аргумент є регулярним виразом, до виклику його метода [Symbol.matchAll](/uk/docs/Web/JavaScript/Reference/Global_Objects/Symbol/matchAll) чи[Symbol.replace]().- Конструктор
RegExp()безпосередньо повертає аргументpatternлише в тому випадку, колиpatternє регулярним виразом (серед інших умов). Якщоpatternє регулярним виразом, то також будуть перевірені властивостіpattern:sourceіflags, замість зведенняpatternдо рядка.
Наприклад, String.prototype.endsWith() зводить усе своє введення до рядків, але викидає виняток, якщо аргумент є регулярним виразом, адже цей метод розроблений лише для зіставлення рядків, а використання регулярного виразу – ймовірно, помилка розробника.
"foobar".endsWith({ toString: () => "bar" }); // true
"foobar".endsWith(/bar/); // TypeError: First argument to String.prototype.endsWith must not be a regular expression
Перевірку можна обійти, присвоївши [Symbol.match] хибне значення, котре не є undefined. Це означає, що такий регулярний вираз не можна використати для String.prototype.match() (адже без [Symbol.match], match() створюватиме новий об'єкт RegExp з двома рисками на кінцях, доданими методом re.toString()), але такий регулярний вираз можна використати для буквально будь-чого іншого.
const re = /bar/g;
re[Symbol.match] = false;
"/bar/g".endsWith(re); // true
re.exec("bar"); // [ 'bar', index: 0, input: 'bar', groups: undefined ]
"bar & bar".replace(re, "foo"); // 'foo & foo'
Властивості RegExp у стилі Perl
Слід звернути увагу, що декілька властивостей RegExp мають і довгу, і коротку (в стилі Perl) назву. Обидва імені завжди вказують на одне й те саме значення. (Perl – мова програмування, на основі якої JavaScript створив свої регулярні вирази.) Дивіться також нерекомендовані властивості RegExp.
Конструктор
RegExp()Породжує новий об'єкт
RegExp.
Статичні властивості
RegExp.$1, …,RegExp.$9Статичні властивості лише для зчитування, що містять збіги підрядків у дужках.
RegExp.input($_)Статична властивість лише для зчитування, що містить останній рядок, щодо якого відбувся успішний збіг.
RegExp.lastMatch($&)Статична властивість лише для зчитування, що містить останній підрядок, з яким трапився збіг.
RegExp.lastParen($+)Статична властивість лише для зчитування, що містить останній збіг підрядку в дужках.
RegExp.leftContext($`)Статична властивість лише для зчитування, що містить підрядок, котрий передував останньому збігові.
RegExp.rightContext($')Статична властивість лише для зчитування, що містить підрядок, котрий стояв після останнього збігу.
RegExp[Symbol.species]Функція-конструктор, що використовується для створення похідних об'єктів.
Статичні методи
RegExp.escape()Екранує будь-які можливі символи синтаксису регулярних виразів, присутні в рядку, й повертає новий рядок, який можна безпечно використовувати як літеральний патерн для конструктора
RegExp().
Властивості примірника
Ці властивості означені на RegExp.prototype і є спільними для всіх примірників RegExp.
RegExp.prototype.constructorФункція-конструктор, що створила об'єкт-примірник. Для примірників
RegExpпочатковим значенням є конструкторRegExp.RegExp.prototype.dotAll(точка все)Чи дає
.збіг із символами нового рядка.RegExp.prototype.flags(позначки)Рядок, що містить позначки об'єкта
RegExp.RegExp.prototype.global(глобальний)Чи перевірятиме регулярний вираз усі можливі збіги в рядку, чи лишень перший.
RegExp.prototype.hasIndices(має індекси)Чи видає результат регулярного виразу початковий і кінцевий індекси захоплених підрядків.
RegExp.prototype.ignoreCase(ігнорувати регістр)Чи ігноруватиметься при пошуку збігу в рядку регістр символів.
RegExp.prototype.multiline(багаторядковий)Чи відбуватиметься пошук в тексті на багатьох рядках.
RegExp.prototype.source(код)Текст патерну.
RegExp.prototype.sticky(липкий)Чи є пошук липким.
RegExp.prototype.unicodeЧи ввімкнені можливості Unicode.
RegExp.prototype.unicodeSetsЧи додана позначка
v, оновлена версія режимуu, чи ні.
Ці властивості є власними властивостями кожного окремого примірника RegExp.
lastIndex(останній індекс)Індекс, з якого почнеться наступний пошук збігу.
Методи примірника
RegExp.prototype.compile()(компілювати)(Повторно) компілює регулярний вираз під час виконання сценарію.
RegExp.prototype.exec()(виконати)Виконує пошук збігу у своєму рядковому параметрі.
RegExp.prototype.test()(перевірити)Перевіряє на збіг свій рядковий параметр.
RegExp.prototype.toString()Повертає рядок, що представляє вказаний об'єкт. Відкидає метод
Object.prototype.toString().RegExp.prototype[Symbol.match]()Виконує пошук збігу в наданому рядку й повертає результат.
RegExp.prototype[Symbol.matchAll]()Повертає усі збіги регулярного виразу в рядку.
RegExp.prototype[Symbol.replace]()Замінює збіги в даному рядку новим підрядком.
RegExp.prototype[Symbol.search]()Шукає збіг в наданому рядку й повертає індекс, за яким патерн знайдений.
RegExp.prototype[Symbol.split]()Розбиває наданий рядок на масив, поділяючи рядок на підрядки.
Приклади
Використання регулярного виразу для зміни формату даних
Наступний сценарій застосовує метод String.prototype.replace(), щоб знайти ім'я в форматі ім'я прізвище й вивести його в форматі прізвище, ім'я.
В тексті заміни сценарій використовує $1 і $2, аби вказати на результати відповідних дужок збігу в патерні регулярного виразу
const re = /(\w+)\s(\w+)/;
const str = "Maria Cruz";
const newstr = str.replace(re, "$2, $1");
console.log(newstr);
Виведе "Cruz, Maria".
Застосування регулярного виразу для розбиття рядків з різними символами нового рядка
Усталене закінчення рядка залежить від платформи (Unix, Windows тощо). Розбиття рядків, запропоноване в цьому прикладі, працює на всіх платформах.
const text = "Певний текст\nІ ще трохи\r\nІще\rАж ось кінець";
const lines = text.split(/\r\n|\r|\n/);
console.log(lines); // ['Певний текст', 'І ще трохи', 'Іще', 'Аж ось кінець']
Зверніть увагу, що порядок патернів у регулярному виразі має значення.
Застосування регулярного виразу на багатьох рядках
const s = "Please yes\nmake my day!";
s.match(/yes.*day/);
// Повертає null
s.match(/yes[^]*day/);
// Повертає ["yes\nmake my day"]
Застосування регулярного виразу з позначкою липкості
Позначка липкості вказує на те, що регулярний вираз виконує в цільовому рядку липкий пошук збігу, намагаючись почати пошук від RegExp.prototype.lastIndex.
const str = "#foo#";
const regex = /foo/y;
regex.lastIndex = 1;
regex.test(str); // true
regex.lastIndex = 5;
regex.test(str); // false (враховується lastIndex, адже присутня позначка липкості)
regex.lastIndex; // 0 (скинуто після невдачі пошуку)
Різниця між позначкою липкості й позначкою глобальності
За присутності позначки липкості y наступний збіг повинен відбутися на позиції lastIndex, а за присутності позначки глобальності g – збіг може трапитись на позиції lastIndex чи дальшій:
const re = /\d/y;
let r;
while ((r = re.exec("123 456"))) {
console.log(r, "AND re.lastIndex", re.lastIndex);
}
// [ '1', index: 0, input: '123 456', groups: undefined ] AND re.lastIndex 1
// [ '2', index: 1, input: '123 456', groups: undefined ] AND re.lastIndex 2
// [ '3', index: 2, input: '123 456', groups: undefined ] AND re.lastIndex 3
// … і – більше жодних збігів.
З позначкою глобальності g був би збіг з усіма 6 цифрами, а не лише 3.
Регулярний вираз та символи Unicode
\w і \W дають збіг лише з символами на основі ASCII; наприклад, від a до z, від A до Z, від 0 до 9, і _.
Для пошуку збігу серед символів інших мов, як то кириличними чи гебрайськими, слід використовувати \uhhhh, де hhhh – значення Unicode символу в шістнадцятковому вигляді.
Цей приклад демонструє, як можна відділити від слова символи Unicode.
const text = "Зразок text українською мовою";
const regex = /[\u0400-\u04FF]+/g;
const match = regex.exec(text);
console.log(match[0]); // 'Зразок'
console.log(regex.lastIndex); // 6
const match2 = regex.exec(text);
console.log(match2[0]); // 'українською' (а не 'text')
console.log(regex.lastIndex); // 23
// і так далі
Можливість екранування властивостей Unicode пропонує простіший спосіб цілитися на конкретні діапазони Unicode, дозволяючи інструкції штибу \p{scx=Cyrl} (для збігу з будь-якою кириличною літерою) чи \p{L}/u (для збігу з літерою з будь-якої мови).
Видобування імені піддомену з URL
const url = "http://xxx.domain.com";
console.log(/^https?:\/\/(.+?)\./.exec(url)[1]); // 'xxx'
[!NOTE] Замість використання для розбору URL регулярних виразів зазвичай краще застосовувати вбудований розбирач URL, використовуючи URL API.
Будування регулярного виразу на основі динамічного введення
const breakfasts = ["bacon", "eggs", "oatmeal", "toast", "cereal"];
const order = "Let me get some bacon and eggs, please";
order.match(new RegExp(`\\b(${breakfasts.join("|")})\\b`, "g"));
// Повертає ['bacon', 'eggs']
Специфікації
Сумісність із браузерами
| desktop | mobile | server | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
RegExp
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
@@match
|
Chrome Full support 50 | Edge Full support 13 | Firefox Full support 49 | Internet Explorer No support Ні | Opera Full support 37 | Safari Full support 10 | WebView Android Full support 50 | Chrome Android Full support 50 | Firefox for Android Full support 49 | Opera Android Full support 37 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
@@matchAll
|
Chrome Full support 73 | Edge Full support 79 | Firefox Full support 67 | Internet Explorer No support Ні | Opera Full support 60 | Safari Full support 13 | WebView Android Full support 73 | Chrome Android Full support 73 | Firefox for Android Full support 67 | Opera Android Full support 52 | Safari on iOS Full support 13 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 12.0.0 |
@@replace
|
Chrome Full support 50 | Edge Full support 79 | Firefox Full support 49 | Internet Explorer No support Ні | Opera Full support 37 | Safari Full support 10 | WebView Android Full support 50 | Chrome Android Full support 50 | Firefox for Android Full support 49 | Opera Android Full support 37 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
@@search
|
Chrome Full support 50 | Edge Full support 13 | Firefox Full support 49 | Internet Explorer No support Ні | Opera Full support 37 | Safari Full support 10 | WebView Android Full support 50 | Chrome Android Full support 50 | Firefox for Android Full support 49 | Opera Android Full support 37 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
@@species
|
Chrome Full support 50 | Edge Full support 13 | Firefox Full support 49 | Internet Explorer No support Ні | Opera Full support 37 | Safari Full support 10 | WebView Android Full support 50 | Chrome Android Full support 50 | Firefox for Android Full support 49 | Opera Android Full support 37 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.5.0 |
@@split
|
Chrome Full support 50 | Edge Full support 79 | Firefox Full support 49 | Internet Explorer No support Ні | Opera Full support 37 | Safari Full support 10 | WebView Android Full support 50 | Chrome Android Full support 50 | Firefox for Android Full support 49 | Opera Android Full support 37 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
RegExp() constructor
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
compile
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 6 | Safari Full support 3.1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 2 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
dotAll
|
Chrome Full support 62 | Edge Full support 79 | Firefox Full support 78 | Internet Explorer No support Ні | Opera Full support 49 | Safari Full support 12 | WebView Android Full support 62 | Chrome Android Full support 62 | Firefox for Android Full support 79 | Opera Android Full support 46 | Safari on iOS Full support 12 | Samsung Internet Full support 8.0 | Deno Full support 1.0 | Node.js Full support 8.10.0 |
exec
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
flags
|
Chrome Full support 49 | Edge Full support 79 | Firefox Full support 37 | Internet Explorer No support Ні | Opera Full support 39 | Safari Full support 9 | WebView Android Full support 49 | Chrome Android Full support 49 | Firefox for Android Full support 37 | Opera Android Full support 41 | Safari on iOS Full support 9 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
global
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
Prototype accessor property (ES2015)
|
Chrome Full support 48 | Edge Full support 12 | Firefox Full support 38 | Internet Explorer Full support 5.5 | Opera Full support 35 | Safari Full support 1.3 | WebView Android Full support 48 | Chrome Android Full support 48 | Firefox for Android Full support 38 | Opera Android Full support 35 | Safari on iOS Full support 1 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
hasIndices
|
Chrome Full support 90 | Edge Full support 90 | Firefox Full support 88 | Internet Explorer No support Ні | Opera Full support 76 | Safari Full support 15 | WebView Android Full support 90 | Chrome Android Full support 90 | Firefox for Android Full support 88 | Opera Android Full support 64 | Safari on iOS Full support 15 | Samsung Internet Full support 15.0 | Deno Full support 1.8 | Node.js No support Ні |
ignoreCase
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
Prototype accessor property (ES2015)
|
Chrome Full support 48 | Edge Full support 12 | Firefox Full support 38 | Internet Explorer Full support 5.5 | Opera Full support 35 | Safari Full support 1.3 | WebView Android Full support 48 | Chrome Android Full support 48 | Firefox for Android Full support 38 | Opera Android Full support 35 | Safari on iOS Full support 1 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
RegExp.input ($_)
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 15 | Safari Full support 3 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 14 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
lastIndex
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
RegExp.lastMatch ({{Compat}})
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 10.5 | Safari Full support 3 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 11 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
RegExp.lastParen ($+)
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 10.5 | Safari Full support 3 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 11 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
RegExp.leftContext ($\`)
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 8 | Safari Full support 3 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
lookbehind assertions ( (?<= ) and (?<! ))
|
Chrome Full support 62 | Edge Full support 79 | Firefox Full support 78 | Internet Explorer No support Ні | Opera Full support 49 | Safari No support Ні | WebView Android Full support 62 | Chrome Android Full support 62 | Firefox for Android Full support 79 | Opera Android Full support 46 | Safari on iOS No support Ні | Samsung Internet Full support 8.0 | Deno Full support 1.0 | Node.js Full support 8.10.0 |
multiline
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
Prototype accessor property (ES2015)
|
Chrome Full support 48 | Edge Full support 12 | Firefox Full support 38 | Internet Explorer Full support 5.5 | Opera Full support 35 | Safari Full support 1.3 | WebView Android Full support 48 | Chrome Android Full support 48 | Firefox for Android Full support 38 | Opera Android Full support 35 | Safari on iOS Full support 1 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
RegExp.$1-$9
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
Named capture groups
|
Chrome Full support 64 | Edge Full support 79 | Firefox Full support 78 | Internet Explorer No support Ні | Opera Full support 51 | Safari Full support 11.1 | WebView Android Full support 64 | Chrome Android Full support 64 | Firefox for Android Full support 79 | Opera Android Full support 47 | Safari on iOS Full support 11.3 | Samsung Internet Full support 9.0 | Deno Full support 1.0 | Node.js Full support 10.0.0 |
Unicode property escapes ( \p{...})
|
Chrome Full support 64 | Edge Full support 79 | Firefox Full support 78 | Internet Explorer No support Ні | Opera Full support 51 | Safari Full support 11.1 | WebView Android Full support 64 | Chrome Android Full support 64 | Firefox for Android Full support 79 | Opera Android Full support 47 | Safari on iOS Full support 11.3 | Samsung Internet Full support 9.0 | Deno Full support 1.0 | Node.js Full support 10.0.0 |
RegExp.rightContext ($\')
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 5.5 | Opera Full support 8 | Safari Full support 3 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
source
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
"(?:)" for empty regexps
|
Chrome Full support 6 | Edge Full support 12 | Firefox Full support 38 | Internet Explorer No support Ні | Opera Full support 15 | Safari Full support 5 | WebView Android Full support 37 | Chrome Android Full support 18 | Firefox for Android Full support 38 | Opera Android Full support 14 | Safari on iOS Full support 4.2 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
Escaping
|
Chrome Full support 73 | Edge Full support 12 | Firefox Full support 38 | Internet Explorer Full support 10 | Opera Full support 60 | Safari Full support 6 | WebView Android Full support 73 | Chrome Android Full support 73 | Firefox for Android Full support 38 | Opera Android Full support 52 | Safari on iOS Full support 6 | Samsung Internet Full support 11.0 | Deno Full support 1.0 | Node.js Full support 12.0.0 |
Prototype accessor property (ES2015)
|
Chrome Full support 48 | Edge Full support 12 | Firefox Full support 41 | Internet Explorer Full support 4 | Opera Full support 35 | Safari Full support 1.3 | WebView Android Full support 48 | Chrome Android Full support 48 | Firefox for Android Full support 41 | Opera Android Full support 35 | Safari on iOS Full support 1 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
sticky
|
Chrome Full support 49 | Edge Full support 13 | Firefox Full support 3 | Internet Explorer No support Ні | Opera Full support 36 | Safari Full support 10 | WebView Android Full support 49 | Chrome Android Full support 49 | Firefox for Android Full support 4 | Opera Android Full support 36 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
Anchored sticky flag behavior per ES2015
|
Chrome Full support 49 | Edge Full support 13 | Firefox Full support 44 | Internet Explorer No support Ні | Opera Full support 36 | Safari Full support 10 | WebView Android Full support 49 | Chrome Android Full support 49 | Firefox for Android Full support 44 | Opera Android Full support 36 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
Prototype accessor property (ES2015)
|
Chrome Full support 49 | Edge Full support 13 | Firefox Full support 38 | Internet Explorer No support Ні | Opera Full support 36 | Safari Full support 10 | WebView Android Full support 49 | Chrome Android Full support 49 | Firefox for Android Full support 38 | Opera Android Full support 36 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
test
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
toSource
|
Chrome No support Ні | Edge No support Ні | Firefox No support 1 – 74 | Internet Explorer No support Ні | Opera No support Ні | Safari No support Ні | WebView Android No support Ні | Chrome Android No support Ні | Firefox for Android No support 4 – 79 | Opera Android No support Ні | Safari on iOS No support Ні | Samsung Internet No support Ні | Deno No support Ні | Node.js No support Ні |
toString
|
Chrome Full support 1 | Edge Full support 12 | Firefox Full support 1 | Internet Explorer Full support 4 | Opera Full support 5 | Safari Full support 1 | WebView Android Full support 1 | Chrome Android Full support 18 | Firefox for Android Full support 4 | Opera Android Full support 10.1 | Safari on iOS Full support 1 | Samsung Internet Full support 1.0 | Deno Full support 1.0 | Node.js Full support 0.10.0 |
Escaping
|
Chrome Full support 73 | Edge Full support 12 | Firefox Full support 38 | Internet Explorer Full support 9 | Opera Full support 60 | Safari Full support 6 | WebView Android Full support 73 | Chrome Android Full support 73 | Firefox for Android Full support 38 | Opera Android Full support 52 | Safari on iOS Full support 6 | Samsung Internet Full support 11.0 | Deno Full support 1.0 | Node.js Full support 12.0.0 |
unicode
|
Chrome Full support 50 | Edge Full support 12 | Firefox Full support 46 | Internet Explorer No support Ні | Opera Full support 37 | Safari Full support 10 | WebView Android Full support 50 | Chrome Android Full support 50 | Firefox for Android Full support 46 | Opera Android Full support 37 | Safari on iOS Full support 10 | Samsung Internet Full support 5.0 | Deno Full support 1.0 | Node.js Full support 6.0.0 |
Примітки щодо Firefox
Починаючи з Firefox 34, у випадку захоплення групи з кванторами, що не дають їй спрацювати, текст збігу групи захоплення – undefined, а не порожній рядок:
// Firefox 33 чи старший
"x".replace(/x(.)?/g, (m, group) => {
console.log(`група: ${JSON.stringify(group)}`);
});
// група: ""
// Firefox 34 чи новіший
"x".replace(/x(.)?/g, (m, group) => {
console.log(`група: ${group}`);
});
// група: undefined
Зверніть увагу, що заради сумісності RegExp.$N й далі повертає порожній рядок, а не undefined (вада 1053944).