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.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).