正则表达式 unicode 修饰符及兼容性

272 阅读1分钟

ES6 对正则表达式添加了 u 修饰符,含义为 “Unicode 模式”,用来正确处理大于 \uFFFF 的 Unicode 字符。

示例

/^\uD83D/u.test('\uD83D\uDC2A')

上面代码可以被 babel 转译以支持低版本浏览器

/^(?:\uD83D(?![\uDC00-\uDFFF]))/.test("\uD83D\uDC2A");

在 ES6 中正则对象还增加了 flags 属性和 unicode 属性,可以获取到是否有 unicode 修饰符。

var a = /^\uD83D/u;
console.log(a.flags); 
console.log(a.unicode); 

然而,如果使用 babel,转译后的代码将无法正确获取 flags 和 unicode 了。

此时有 2 种解决方案:

  1. 使用正则的 polyfill
  2. 在管理上禁止使用 flags 和 unicode 属性,以及禁止使用 new 创建正则对象

由于业界并没有一个正则的 polyfill 可以用,使用正则的 polyfill 不但要替换原生 RegExp 类,还要替换原生 String 类的 match、replace、split 方法。不符合尽量使用原生功能的原则。因此建议在管理上禁止使用 flags 和 unicode 属性,以及禁止使用 new 创建正则对象。

通过 eslint 插件可以禁止开发者使用 flags 和 unicode 属性,以及禁止使用 new 创建正则对象。