版本

require-unicode-regexp

強制在 RegExp 上使用 uv 標記

💡 有建議

此規則報告的一些問題可透過編輯器建議手動修正

RegExp u 標記有兩個效果

  1. 使正規表示式正確處理 UTF-16 代理對。

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

    /^[👍]$/.test("👍") //→ false
    /^[👍]$/u.test("👍") //→ true
    
  2. 使正規表示式及早拋出語法錯誤,並停用附錄 B 延伸

    由於歷史原因,JavaScript 正規表示式可以容忍語法錯誤。例如,/\w{1, 2/ 是一個語法錯誤,但 JavaScript 不會拋出錯誤。它會比對諸如 "a{1, 2" 之類的字串。此類復原邏輯定義在附錄 B 中。

    u 標記會停用附錄 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 標記。

此規則的錯誤程式碼範例

在遊樂場中開啟
/*eslint require-unicode-regexp: error */

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

此規則的正確程式碼範例

在遊樂場中開啟
/*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 = /foo/;

const fooEmptyRegexp = new RegExp('foo');

const foo = /foo/v;

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

使用 { "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 = /foo/;

const fooEmptyRegexp = new RegExp('foo');

const foo = /foo/u;

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

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

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

const foo = /foo/v;

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

何時不應使用此規則

如果您不希望對沒有 uv 標記的正規表示式發出警告,則可以安全地停用此規則。

版本

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

延伸閱讀

資源

變更語言