ES9 中的正则表达式(RegExp)相关的更新
前言
在 ES6 中,对于正则表达式(RegExp)的支持已经趋于完善,但是随着业务需求的不断增加,我们对正则表达式的需求也越来越高,因此在 ES9 中,对正则表达式进行了升级,增加了一些非常实用的新特性,本文将介绍 ES9 中正则表达式相关的更新。
零宽度断言
ES9 中新增了一种非常重要的特性——零宽度断言(zero-width assertions),它可以匹配某个字符前面或者后面的位置,而不是实际的字符本身。
通俗点来讲就是在不获取正确的匹配的情况下设置匹配的条件,这样就不会改变实际的匹配结果。
顺序肯定先行断言
顺序肯定先行断言(Positive Lookahead)是一种零宽度断言,常用于寻找一个前缀,比如匹配邮件地址的用户名部分。
语法:
(?=pattern)
示例代码:
// 匹配以“good”为前缀的字符串 /console.log(/good(?=\w+)/.test('good boy')); // true /console.log(/good(?=\w+)/.test('good man')); // true /console.log(/good(?=\w+)/.test('good')); // false
注释:
该正则表达式通过零宽度断言判断“good”后面紧跟的字符是不是字母、数字或下划线。因此,第一、二个测试用例均返回 true,而第三个测试用例返回 false。
顺序否定先行断言
顺序否定先行断言(Negative Lookahead)与顺序肯定先行断言类似,但是匹配条件与之相反。
语法:
(?!pattern)
示例代码:
// 匹配不以“good”为前缀的字符串 /console.log(/good(?! boy)/.test('good man')); // true /console.log(/good(?! boy)/.test('good boy')); // false
注释:
第一个测试用例符合匹配条件,返回 true,而第二个测试用例不符合匹配条件,返回 false。
顺序肯定后行断言
顺序肯定后行断言(Positive Lookbehind)是一种零宽度断言,常用于寻找一个后缀,比如匹配时间字符串中的小时。
语法:
(?<=pattern)
示例代码:
// 匹配时间字符串中的小时 /console.log(/(?<=\d+:)\d+/.test('09:23')); // true /console.log(/(?<=\d+:)\d+/.test('05:12')); // true /console.log(/(?<=\d+:)\d+/.test('9:23')); // false
注释:
正则表达式通过逆序前行断言判断“:”前面是不是数字。因此,第一、二个测试用例均符合条件,返回 true,而第三个测试用例不符合条件,返回 false。
顺序否定后行断言
顺序否定后行断言(Negative Lookbehind)与顺序肯定后行断言类似,但是匹配条件与之相反。
语法:
(?<!pattern)
示例代码:
// 匹配不以时间字符串中的小时结尾的字符串 /console.log(/(?<!\d+:)\d+/.test('09:23')); // true /console.log(/(?<!\d+:)\d+/.test('05:12')); // true /console.log(/(?<!\d+:)\d+/.test('1:23')); // false
注释:
正则表达式通过逆序前行断言判断“:”前面不是数字。因此,第一、二个测试用例均符合条件,返回 true,而第三个测试用例不符合条件,返回 false。
其他更新内容
正则表达式命名捕获组
在 ES9 中,正则表达式引入了一个新概念,即命名捕获组,可以给捕获到的子串命名,方便后续对其进行操作。
语法:
(?<name>pattern)
示例代码:
// 匹配输入的日期字符串 const pattern = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/; const match = pattern.exec('2019-06-10'); /console.log(match.groups.year); // 2019 /console.log(match.groups.month); // 06 /console.log(match.groups.day); // 10
注释:
正则表达式通过命名捕获组以每个部分的名字来捕获,这大大增加了代码的可读性,使开发更加便利。
Unicode 字符转义
在 ES6 中,Unicode 字符序列已经获得了很好的支持,而在 ES9 中,正则表达式也新增了关于 Unicode 的支持,可以使用 Unicode 字符转义来匹配 Unicode 字符。
语法:
\p{PropertyValue}
示例代码:
// 匹配 Unicode 中所有数字 /console.log(/\p{Nd}/u.test('1')); // true /console.log(/\p{Nd}/u.test('一')); // false /console.log(/\p{Nd}/u.test('١')); // true
注释:
使用 Unicode 字符转义,可以非常方便地进行 Unicode 字符匹配,造福于多语言开发的需求。
总结
ES9 中的正则表达式是一个非常实用的更新,引入了零宽度断言、正则表达式命名捕获组、Unicode 字符转义等一系列实用的功能,这些功能的引入,极大的扩展了正则表达式的能力,提高了正则表达式的可读性和可维护性。因此,在编写复杂的前端页面时,我们可以更加自主地应用这些新特性,让代码更加简洁、高效。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/652c9cfe7d4982a6ebe43f5d