在 ECMAScript 2017 (也称作 ES8)中,对于正则表达式(RegExp)以及 Unicode 相关内容都进行了升级和改进,为前端开发带来了一些全新的功能和改善,本文就来详细介绍一下这些升级和改进。
RegExp 的升级
1. 命名捕获组
在早期的正则表达式中,我们可以使用括号来进行捕获,例如:
const re = /(\d{4})-(\d{2})-(\d{2})/; const match = re.exec('2022-08-08'); console.log(match[1], match[2], match[3]); // '2022', '08', '08'
在 ES8 中,为了方便更好的处理捕获结果,可以使用命名捕获组:
const re = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const match = re.exec('2022-08-08'); console.log(match.groups.year); // '2022' console.log(match.groups.month); // '08' console.log(match.groups.day); // '08'
可以看到,使用命名捕获组能够更加直观地获取捕获的结果。
2. 反向断言
在 ES8 之前,只有前向断言,在正则表达式中使用 x(?=y)
可以表示 x 后面必须跟着 y 才能匹配成功,如:
const re = /\d+(?=%)/; const match = re.exec('10% discount'); console.log(match[0]); // '10'
在 ES8 中,可以使用反向断言,使用 (?<=y)x
表示 x 前面必须跟着 y 才能匹配成功,如:
const re = /(?<=\$)\d+/; const match = re.exec('$10'); console.log(match[0]); // '10'
3. dotAll 模式
在正则表达式中使用 .
表示可以匹配除了换行符(\n)之外的任何字符。在 ES8 中,可以使用 s
标志来开启 dotAll 模式,使用 .
可以匹配换行符。
const re = /hello.world/s; const match = re.exec('hello\nworld'); console.log(match[0]); // 'hello\nworld'
Unicode 的改进
在 ES6 中,引入了 Unicode 的相关内容,并且在 ES8 中进一步加强了相关功能。
1. Unicode 属性转义
在正则表达式中,可以使用 \d
表示数字字符,使用 \w
表示字母、数字以及下划线。在 ES8 中,可以使用 \p{PropertyName}
表示 Unicode 属性。例如,使用 \p{Letter}
表示Unicode 中的所有字母字符,如下:
const re = /\p{Letter}+/u; const match = re.exec('你好 World'); console.log(match[0]); // '你好'
2. Unicode 字符串的扩展
在 ES8 中,可以使用 String.prototype.normalize()
方法将 Unicode 字符串进行规范化。规范化可以将有多种 Unicode 编码的等价字符转换成同一种规范形式,方便进行比较。
const str1 = '\u1E9B\u0323'; // 'ẛ̣' const str2 = '\u1E69'; // 'ṩ' console.log(str1 === str2); // false const normalizedStr1 = str1.normalize(); const normalizedStr2 = str2.normalize(); console.log(normalizedStr1 === normalizedStr2); // true
总结
ES8 中对于 RegExp 和 Unicode 的升级和改进为前端开发带来了更加方便、强大的功能。合理使用这些特性可以让我们的代码更具可读性和灵活性。
代码示例:https://codepen.io/wenjunxiao/pen/PojROzL
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6469d83a968c7c53b09a4eb0