
require-unicode-regexp
强制在正则表达式上使用 u
或 v
标志
此规则报告的一些问题可以通过编辑器建议手动修复
RegExp u
标志有两个作用
-
使正则表达式正确处理 UTF-16 代理对。
特别是,字符范围语法得到正确的行为。
/^[👍]$/.test("👍") //→ false /^[👍]$/u.test("👍") //→ true
-
使正则表达式尽早抛出语法错误,通过禁用 Annex B 扩展。
由于历史原因,JavaScript 正则表达式对语法错误具有容错性。例如,
/\w{1, 2/
是一个语法错误,但 JavaScript 不会抛出错误。它会匹配诸如"a{1, 2"
这样的字符串。这种恢复逻辑在 Annex B 中定义。u
标志禁用了 Annex B 定义的恢复逻辑。因此,你可以尽早发现错误。这类似于 严格模式。
RegExp v
标志,在 ECMAScript 2024 中引入,是 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”
u
标志可能在不支持 v
标志的环境中更受欢迎。
当使用 { "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 中引入。
延伸阅读
