版本

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

此規則也禁用將不帶表達式的樣板字面值和不帶表達式的 String.raw 標籤樣板字面值用於 RegExp 建構函式。

此規則並非禁用所有 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}`);

選項

此規則有一個物件選項

  • 設定為 truedisallowRedundantWrapping 會額外檢查不必要地包裝的正規表示式字面值(預設為 false)。

disallowRedundantWrapping

預設情況下,當正規表示式字面值不必要地包裝在 RegExp 建構函式呼叫中時,此規則不會檢查。當選項 disallowRedundantWrapping 設定為 true 時,此規則也將禁用此類不必要的模式。

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

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

new RegExp(/abc/);

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

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

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

/abc/;

/abc/u;

new RegExp(/abc/, flags);

版本

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

延伸閱讀

資源

變更語言