Spec-Zone.ru › ESLint

require-unicode-regexp

Требует использовать флаг u или v для регулярных выражений

💡 hasSuggestions

Некоторые проблемы, о которых сообщает это правило, можно исправить вручную с помощью предложений редактора

Флаг u регулярного выражения имеет два эффекта:

  1. Обеспечивает корректную обработку суррогатных пар UTF-16 регулярным выражением.

    В частности, синтаксис диапазонов символов начинает работать корректно.

    /^[👍]$/.test("👍") //→ false
    /^[👍]$/u.test("👍") //→ true
    
  2. Заставляет регулярное выражение раньше выдавать синтаксические ошибки, отключая расширения приложения B.

    По историческим причинам регулярные выражения JavaScript допускают синтаксические ошибки. Например, /\w{1, 2/ — это синтаксическая ошибка, но JavaScript не сообщает о ней. Вместо этого выражение сопоставляется с такими строками, как "a{1, 2". Такая логика восстановления определена в приложении B.

    Флаг u отключает логику восстановления, определённую в приложении B. В результате вы можете обнаружить ошибки раньше. Это похоже на строгий режим.

Флаг v регулярного выражения, появившийся в ECMAScript 2024, является надмножеством флага u и предоставляет ещё две возможности:

  1. Свойства строк 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 ✅
    
  2. Нотация множеств

    Она позволяет выполнять операции над множествами классов символов.

    const re = /[\p{White_Space}&&\p{ASCII}]/v;
    re.test('\n'); // → true
    re.test('\u2028'); // → false
    

Таким образом, флаги u и v позволяют эффективнее работать с регулярными выражениями.

Подробное описание правила

Это правило требует использовать флаг u или v для регулярных выражений.

Примеры неправильного кода для этого правила:

Открыть в Playground
/*eslint require-unicode-regexp: error */

const a = /aaa/
const b = /bbb/gi
const c = new RegExp("ccc")
const d = new RegExp("ddd", "gi")

Примеры правильного кода для этого правила:

Открыть в Playground
/*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" }:

Открыть в Playground
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */

const fooEmpty = /foo/;

const fooEmptyRegexp = new RegExp('foo');

const foo = /foo/v;

const fooRegexp = new RegExp('foo', 'v');

Примеры правильного кода для этого правила с параметром { "requireFlag": "u" }:

Открыть в Playground
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */

const foo = /foo/u;

const fooRegexp = new RegExp('foo', 'u');

requireFlag: “v”

Флаг v может быть предпочтительнее, если он поддерживается, поскольку у него больше возможностей, чем у флага u (например, возможность проверять свойства строк Unicode). Однако его синтаксис строже (например, некоторые символы внутри классов символов необходимо экранировать).

Примеры неправильного кода для этого правила с параметром { "requireFlag": "v" }:

Открыть в Playground
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */

const fooEmpty = /foo/;

const fooEmptyRegexp = new RegExp('foo');

const foo = /foo/u;

const fooRegexp = new RegExp('foo', 'u');

Примеры правильного кода для этого правила с параметром { "requireFlag": "v" }:

Открыть в Playground
/*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.

Дополнительная литература

GitHub — tc39/proposal-regexp-v-flag: нотация множеств UTS18 в регулярных выражениях
github.com
Флаг v для RegExp: нотация множеств и свойства строк · V8
v8.dev

Ресурсы

  • Исходный код правила
  • Исходный код тестов

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/require-unicode-regexp

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API