
require-unicode-regexp
強制在 RegExp 上使用 u
或 v
標記
此規則報告的一些問題可透過編輯器建議手動修正
RegExp u
標記有兩個效果
-
使正規表示式正確處理 UTF-16 代理對。
特別是,字元範圍語法會取得正確的行為。
/^[👍]$/.test("👍") //→ false /^[👍]$/u.test("👍") //→ true
-
使正規表示式及早拋出語法錯誤,並停用附錄 B 延伸。
由於歷史原因,JavaScript 正規表示式可以容忍語法錯誤。例如,
/\w{1, 2/
是一個語法錯誤,但 JavaScript 不會拋出錯誤。它會比對諸如"a{1, 2"
之類的字串。此類復原邏輯定義在附錄 B 中。u
標記會停用附錄 B 定義的復原邏輯。因此,您可以及早發現錯誤。這類似於嚴格模式。
在 ECMAScript 2024 中引入的 RegExp v
標記是 u
標記的超集,並提供另外兩個功能
-
字串的 Unicode 屬性
使用 Unicode 屬性逸出,您可以使用字串的屬性。
const re = /^\p{RGI_Emoji}$/v; // Match an emoji that consists of just 1 code point: re.test('⚽'); // '\u26BD' // → true ✅ // Match an emoji that consists of multiple code points: re.test('👨🏾⚕️'); // '\u{1F468}\u{1F3FE}\u200D\u2695\uFE0F' // → true ✅
-
集合符號
它允許字元類別之間的集合運算。
const re = /[\p{White_Space}&&\p{ASCII}]/v; re.test('\n'); // → true re.test('\u2028'); // → false
因此,u
和 v
標記讓我們可以更好地使用正規表示式。
規則詳細資訊
此規則旨在強制在正規表示式上使用 u
或 v
標記。
此規則的錯誤程式碼範例
/*eslint require-unicode-regexp: error */
const a =
const b =
const c =
const d =
此規則的正確程式碼範例
/*eslint require-unicode-regexp: error */
const a = /aaa/u
const b = /bbb/giu
const c = new RegExp("ccc", "u")
const d = new RegExp("ddd", "giu")
const e = /aaa/v
const f = /bbb/giv
const g = new RegExp("ccc", "v")
const h = new RegExp("ddd", "giv")
// This rule ignores RegExp calls if the flags could not be evaluated to a static value.
function i(flags) {
return new RegExp("eee", flags)
}
選項
此規則有一個物件選項
"requireFlag": "u"|"v"
要求特定的 Unicode 正規表示式標記
requireFlag: “u”
在不支援 v
標記的環境中,可能偏好使用 u
標記。
使用 { "requireFlag": "u" }
選項時,此規則的錯誤程式碼範例
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */
const fooEmpty = ;
const fooEmptyRegexp = ;
const foo = ;
const fooRegexp = ;
使用 { "requireFlag": "u" }
選項時,此規則的正確程式碼範例
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */
const foo = /foo/u;
const fooRegexp = new RegExp('foo', 'u');
requireFlag: “v”
當支援 v
標記時,它可能是更好的選擇,因為它比 u
標記具有更多功能(例如,測試字串的 Unicode 屬性的能力)。但是,它的語法更嚴格(例如,需要在字元類別中逸出某些字元)。
使用 { "requireFlag": "v" }
選項時,此規則的錯誤程式碼範例
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */
const fooEmpty = ;
const fooEmptyRegexp = ;
const foo = ;
const fooRegexp = ;
使用 { "requireFlag": "v" }
選項時,此規則的正確程式碼範例
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */
const foo = /foo/v;
const fooRegexp = new RegExp('foo', 'v');
何時不應使用此規則
如果您不希望對沒有 u
或 v
標記的正規表示式發出警告,則可以安全地停用此規則。
版本
此規則在 ESLint v5.3.0 中引入。
延伸閱讀
