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
developer.mozilla.org
RegExp — JavaScript | MDN
developer.mozilla.org

Ресурсы

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

© 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