
require-unicode-regexp
強制在正規表示式上使用 u
或 v
旗標
此規則回報的部分問題可以透過編輯器建議手動修正
RegExp u
旗標有兩個效果
-
使正規表示式正確處理 UTF-16 surrogate pairs。
特別是,字元範圍語法能獲得正確的行為。
/^[👍]$/.test("👍") //→ false /^[👍]$/u.test("👍") //→ true
-
使正規表示式提早拋出語法錯誤,如同停用 Annex B 擴充。
由於歷史原因,JavaScript 正規表示式對語法錯誤具有容錯性。例如,
/\w{1, 2/
是語法錯誤,但 JavaScript 不會拋出錯誤。它反而會比對像是"a{1, 2"
這樣的字串。這種恢復邏輯定義在 Annex B 中。u
旗標停用 Annex 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 中引入。
延伸閱讀
