Spec-Zone.ru › ESLint

require-unicode-regexp

Принудительное использование флага u или v для RegExp

💡 hasSuggestions

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

Флаг RegExp u имеет два эффекта:

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

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

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

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

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

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

  1. Свойства Юникода строк

    С помощью escape-последовательностей свойств Юникода вы можете использовать свойства строк.

    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" требует конкретного флага Юникода для регулярных выражений

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 (например, возможность проверки свойств Юникода строк). Однако, у него более строгий синтаксис (например, необходимость экранирования определенных символов в классах символов).

Примеры неправильного кода для этого правила с опцией { "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, то можно отключить это правило.

Версия

Это правило было введено в ESLint v5.3.0.

Дополнительные материалы

GitHub - tc39/proposal-regexp-v-flag: UTS18 set notation in regular expressions
RegExp v flag with set notation and properties of strings · V8

Ссылки

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

© 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