require-unicode-regexp
Требует использовать флаг u или v для регулярных выражений
Некоторые проблемы, о которых сообщает это правило, можно исправить вручную с помощью предложений редактора
Флаг u регулярного выражения имеет два эффекта:
-
Обеспечивает корректную обработку суррогатных пар UTF-16 регулярным выражением.
В частности, синтаксис диапазонов символов начинает работать корректно.
/^[👍]$/.test("👍") //→ false /^[👍]$/u.test("👍") //→ true -
Заставляет регулярное выражение раньше выдавать синтаксические ошибки, отключая расширения приложения B.
По историческим причинам регулярные выражения JavaScript допускают синтаксические ошибки. Например,
/\w{1, 2/— это синтаксическая ошибка, но JavaScript не сообщает о ней. Вместо этого выражение сопоставляется с такими строками, как"a{1, 2". Такая логика восстановления определена в приложении B.Флаг
uотключает логику восстановления, определённую в приложении B. В результате вы можете обнаружить ошибки раньше. Это похоже на строгий режим.
Флаг v регулярного выражения, появившийся в ECMAScript 2024, является надмножеством флага u и предоставляет ещё две возможности:
-
Свойства строк Unicode
С помощью экранирования свойств Unicode можно использовать свойства строк.
const re = /^\p{RGI_Emoji}$/v; // Match an emoji that consists of just 1 code point: re.test('⚽'); // '\u26BD' // → true ✅ // Match an emoji that consists of multiple code points: re.test('👨🏾⚕️'); // '\u{1F468}\u{1F3FE}\u200D\u2695\uFE0F' // → true ✅ -
Нотация множеств
Она позволяет выполнять операции над множествами классов символов.
const re = /[\p{White_Space}&&\p{ASCII}]/v; re.test('\n'); // → true re.test('\u2028'); // → false
Таким образом, флаги u и v позволяют эффективнее работать с регулярными выражениями.
Подробное описание правила
Это правило требует использовать флаг u или v для регулярных выражений.
Примеры неправильного кода для этого правила:
/*eslint require-unicode-regexp: error */
const a =
const b =
const c =
const d =
Примеры правильного кода для этого правила:
/*eslint require-unicode-regexp: error */
const a = /aaa/u
const b = /bbb/giu
const c = new RegExp("ccc", "u")
const d = new RegExp("ddd", "giu")
const e = /aaa/v
const f = /bbb/giv
const g = new RegExp("ccc", "v")
const h = new RegExp("ddd", "giv")
// This rule ignores RegExp calls if the flags could not be evaluated to a static value.
function i(flags) {
return new RegExp("eee", flags)
}
Параметры
У этого правила есть один объектный параметр:
-
"requireFlag": "u"|"v"требует определённый флаг Unicode для регулярного выражения
requireFlag: “u”
Флаг u может быть предпочтительнее в средах, где флаг v не поддерживается.
Примеры неправильного кода для этого правила с параметром { "requireFlag": "u" }:
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */
const fooEmpty = ;
const fooEmptyRegexp = ;
const foo = ;
const fooRegexp = ;
Примеры правильного кода для этого правила с параметром { "requireFlag": "u" }:
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */
const foo = /foo/u;
const fooRegexp = new RegExp('foo', 'u');
requireFlag: “v”
Флаг v может быть предпочтительнее, если он поддерживается, поскольку у него больше возможностей, чем у флага u (например, возможность проверять свойства строк Unicode). Однако его синтаксис строже (например, некоторые символы внутри классов символов необходимо экранировать).
Примеры неправильного кода для этого правила с параметром { "requireFlag": "v" }:
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */
const fooEmpty = ;
const fooEmptyRegexp = ;
const foo = ;
const fooRegexp = ;
Примеры правильного кода для этого правила с параметром { "requireFlag": "v" }:
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */
const foo = /foo/v;
const fooRegexp = new RegExp('foo', 'v');
Когда не следует использовать это правило
Если вы не хотите получать предупреждения о регулярных выражениях без флага u или v, это правило можно безопасно отключить.
Примечание о флаге i и \w
В некоторых случаях добавление флага u к регулярному выражению, использующему флаг i и класс символов \w, может изменить его поведение из-за свёртки регистра Unicode.
Например:
const regexWithoutU = /^\w+$/i;
const regexWithU = /^\w+$/iu;
const str = "\u017f\u212a"; // Example Unicode characters
console.log(regexWithoutU.test(str)); // false
console.log(regexWithU.test(str)); // true
Если в этом конкретном случае вы предпочитаете использовать регулярное выражение без поддержки Unicode, это правило можно отключить с помощью комментария eslint-disable:
/* eslint-disable require-unicode-regexp */
const regex = /^\w+$/i;
/* eslint-enable require-unicode-regexp */
Версия
Это правило появилось в ESLint v5.3.0.
Дополнительная литература
Ресурсы
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/require-unicode-regexp