Spec-Zone.ru › ESLint

prefer-regex-literals

Запретить использование конструктора RegExp в пользу литералов регулярных выражений

💡 hasSuggestions

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

Существует два способа создания регулярного выражения:

  • Литералы регулярных выражений, например, /abc/u.
  • Функция-конструктор RegExp, например, new RegExp("abc", "u") или RegExp("abc", "u").

Функция-конструктор особенно полезна, когда вам нужно динамически сгенерировать шаблон, так как она принимает строковые аргументы.

При использовании функции-конструктора со строковыми литералами не забывайте, что правила экранирования строк по-прежнему действуют. Если вы хотите вставить обратную косую черту в шаблон, её необходимо экранировать в строковом литерале. Таким образом, следующие выражения эквивалентны:

new RegExp("^\\d\\.$");

/^\d\.$/;

// matches "0.", "1.", "2." ... "9."

В приведенном выше примере, литерал регулярного выражения легче читать и понимать. Также распространённая ошибка — пропуск дополнительного \ в строковом литерале, что приведёт к совершенно другому регулярному выражению:

new RegExp("^\d\.$");

// equivalent to /^d.$/, matches "d1", "d2", "da", "db" ...

Когда регулярное выражение известно заранее, считается лучшей практикой избегать записи регулярных выражений в виде строковых литералов и использовать вместо функции-конструктора литералы регулярных выражений.

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

Это правило запрещает использование функции-конструктора RegExp со строковыми литералами в качестве аргументов.

Это правило также запрещает использование функции-конструктора RegExp с шаблонными литералами без выражений и String.raw помеченных шаблонных литералов без выражений.

Правило не запрещает все случаи использования конструктора RegExp. Он всё ещё должен использоваться для динамически сгенерированных регулярных выражений.

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

Открыть в Playground
/*eslint prefer-regex-literals: "error"*/

new RegExp("abc");

new RegExp("abc", "u");

RegExp("abc");

RegExp("abc", "u");

new RegExp("\\d\\d\\.\\d\\d\\.\\d\\d\\d\\d");

RegExp(`^\\d\\.$`);

new RegExp(String.raw`^\d\.$`);

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

Открыть в Playground
/*eslint prefer-regex-literals: "error"*/

/abc/;

/abc/u;

/\d\d\.\d\d\.\d\d\d\d/;

/^\d\.$/;

// RegExp constructor is allowed for dynamically generated regular expressions

new RegExp(pattern);

RegExp("abc", flags);

new RegExp(prefix + "abc");

RegExp(`${prefix}abc`);

new RegExp(String.raw`^\d\. ${suffix}`);

Параметры

Это правило имеет параметр типа объект:

  • disallowRedundantWrapping установленный в true дополнительно проверяет ненужное обрамление литералов регулярных выражений (По умолчанию false).

disallowRedundantWrapping

По умолчанию, это правило не проверяет, когда литерал регулярного выражения излишне обернут в вызов конструктора RegExp. Когда параметр disallowRedundantWrapping установлен в true, правило также запретит такие ненужные шаблоны.

Примеры incorrect кода для { "disallowRedundantWrapping": true }

Открыть в Playground
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/

new RegExp(/abc/);

new RegExp(/abc/, 'u');

Примеры correct кода для { "disallowRedundantWrapping": true }

Открыть в Playground
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/

/abc/;

/abc/u;

new RegExp(/abc/, flags);

Версия

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

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

Регулярные выражения - JavaScript | MDN
RegExp - JavaScript | MDN

Ссылки

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

© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/prefer-regex-literals

Spec-Zone.ru

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