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 种解决方案:
- 使用正则的 polyfill
- 在管理上禁止使用 flags 和 unicode 属性,以及禁止使用 new 创建正则对象
由于业界并没有一个正则的 polyfill 可以用,使用正则的 polyfill 不但要替换原生 RegExp 类,还要替换原生 String 类的 match、replace、split 方法。不符合尽量使用原生功能的原则。因此建议在管理上禁止使用 flags 和 unicode 属性,以及禁止使用 new 创建正则对象。
通过 eslint 插件可以禁止开发者使用 flags 和 unicode 属性,以及禁止使用 new 创建正则对象。