版本

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 建構函式。

此規則也禁止使用不含表達式的樣板字面值以及不含表達式的 String.raw 標籤樣板字面值的 RegExp 建構函式。

此規則並非禁止所有 RegExp 建構函式的使用。它仍然應該用於動態產生的正規表示式。

此規則的不正確程式碼範例

在遊樂場開啟
/*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\.$`);

此規則的正確程式碼範例

在遊樂場開啟
/*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 時,此規則也會禁止這種不必要的模式。

適用於 { "disallowRedundantWrapping": true }incorrect 程式碼範例

在遊樂場開啟
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/

new RegExp(/abc/);

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

適用於 { "disallowRedundantWrapping": true }correct 程式碼範例

在遊樂場開啟
/*eslint prefer-regex-literals: ["error", {"disallowRedundantWrapping": true}]*/

/abc/;

/abc/u;

new RegExp(/abc/, flags);

版本

此規則在 ESLint v6.4.0 中引入。

延伸閱讀

資源

變更語言