Versions

require-unicode-regexp

Enforce the use of u or v flag on RegExp

💡 hasSuggestions

Some problems reported by this rule are manually fixable by editor suggestions

正则 u 标志有两个作用。

  1. 使正则表达式正确处理 UTF-16 代用对(surrogate pairs)

    特别是,字符范围语法得到正确的行为。

    /^[👍]$/.test("👍") //→ false
    /^[👍]$/u.test("👍") //→ true
    
  2. 使正则表达式尽早抛出语法错误,因为禁用附件 B 扩展

    由于历史原因,JavaScript 正则表达式对语法错误非常宽容。例如 /\w{1, 2/ 是语法错误,但 JavaScript 并不会抛出这个错误。它会匹配诸如 "a{1, 2" 这样的字符串。这样的恢复逻辑在附件 B 中进行了定义。

    u 标志禁用了附件 B 定义的恢复逻辑。因此,你可以提前发现错误。这类似于严格模式

正则表达式中的 v 标志是在 ECMAScript 2024 中引入的,它是 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 标志。

使用此规则的错误示例:

Open in Playground
/*eslint require-unicode-regexp: error */

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

const e = /aaa/v
const f = /bbb/giv
const g = new RegExp("ccc", "v")
const h = new RegExp("ddd", "giv")

使用此规则的正确示例:

Open in 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")

// This rule ignores RegExp calls if the flags could not be evaluated to a static value.
function f(flags) {
    return new RegExp("eee", flags)
}

何时不用

如果你不想警告存在没有 uv 标志的正则表达式,那么可以安全地禁用此规则。

Version

This rule was introduced in ESLint v5.3.0.

Further Reading

Resources

更改语言