prefer-regex-literals
Запретить использование конструктора RegExp в пользу литералов регулярных выражений
Некоторые проблемы, выявленные этой правилом, могут быть исправлены вручную с помощью предложений редактора.
Существует два способа создания регулярного выражения:
- Литералы регулярных выражений, например,
/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. Он всё ещё должен использоваться для динамически сгенерированных регулярных выражений.
Примеры неправильного кода для этого правила:
/*eslint prefer-regex-literals: "error"*/
;
;
;
;
;
;
;
Примеры правильного кода для этого правила:
/*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 }
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/
;
;
Примеры correct кода для { "disallowRedundantWrapping": true }
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/
/abc/;
/abc/u;
new RegExp(/abc/, flags);
Версия
Это правило было добавлено в ESLint v6.4.0.
Дополнительные материалы
Ссылки
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/rules/prefer-regex-literals