版本

require-unicode-regexp

強制在正規表示式上使用 uv 旗標

💡 有建議

此規則回報的部分問題可以透過編輯器建議手動修正

RegExp u 旗標有兩個效果

  1. 使正規表示式正確處理 UTF-16 surrogate pairs。

    特別是,字元範圍語法能獲得正確的行為。

    /^[👍]$/.test("👍") //→ false
    /^[👍]$/u.test("👍") //→ true
    
  2. 使正規表示式提早拋出語法錯誤,如同停用 Annex B 擴充

    由於歷史原因,JavaScript 正規表示式對語法錯誤具有容錯性。例如,/\w{1, 2/ 是語法錯誤,但 JavaScript 不會拋出錯誤。它反而會比對像是 "a{1, 2" 這樣的字串。這種恢復邏輯定義在 Annex B 中。

    u 旗標停用 Annex B 定義的恢復邏輯。因此,您可以及早發現錯誤。這類似於嚴格模式

ECMAScript 2024 中引入的 RegExp v 旗標是 u 旗標的超集合,並提供兩個額外功能

  1. 字串的 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 ✅
    
  2. 集合表示法

    它允許字元類別之間的集合運算。

    const re = /[\p{White_Space}&&\p{ASCII}]/v;
    re.test('\n'); // → true
    re.test('\u2028'); // → false
    

因此,uv 旗標讓我們能更好地使用正規表示式。

規則詳情

此規則旨在強制在正規表示式上使用 uv 旗標。

此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*eslint require-unicode-regexp: error */

const a = /aaa/
const b = /bbb/gi
const c = new RegExp("ccc")
const d = new RegExp("ddd", "gi")

此規則的 正確 程式碼範例

在 Playground 中開啟
/*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" } 選項時,此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */

const fooEmpty = /foo/;

const fooEmptyRegexp = new RegExp('foo');

const foo = /foo/v;

const fooRegexp = new RegExp('foo', 'v');

使用 { "requireFlag": "u" } 選項時,此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint require-unicode-regexp: ["error", { "requireFlag": "u" }] */

const foo = /foo/u;

const fooRegexp = new RegExp('foo', 'u');

requireFlag: “v”

當支援 v 旗標時,它可能是更好的選擇,因為它比 u 旗標具有更多功能(例如,測試字串 Unicode 屬性的能力)。然而,它的語法也更嚴格(例如,需要在字元類別中逸出某些字元)。

使用 { "requireFlag": "v" } 選項時,此規則的 錯誤 程式碼範例

在 Playground 中開啟
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */

const fooEmpty = /foo/;

const fooEmptyRegexp = new RegExp('foo');

const foo = /foo/u;

const fooRegexp = new RegExp('foo', 'u');

使用 { "requireFlag": "v" } 選項時,此規則的 正確 程式碼範例

在 Playground 中開啟
/*eslint require-unicode-regexp: ["error", { "requireFlag": "v" }] */

const foo = /foo/v;

const fooRegexp = new RegExp('foo', 'v');

何時不該使用

如果您不想針對沒有 uv 旗標的正規表示式發出警告,那麼停用此規則是安全的。

版本

此規則在 ESLint v5.3.0 中引入。

延伸閱讀

資源

變更語言