正则表达式是前端开发中不可或缺的一部分,用于匹配和处理字符串。ECMAScript 2019(ES10)引入了一些新的功能和语法来提高正则表达式的效率和可读性。在本文中,我们将探讨这些改进,并提供示例代码和指导意义。
RegExp 的新功能:Named Capturing Groups
Named Capturing Groups 是一种新的正则表达式功能,它允许你为捕获组命名。在旧的语法中,你可以通过在圆括号中放置表达式来创建捕获组,但是它们只能通过位置进行引用。例如:
const regex = /(\d+)-(\w+)/; const match = regex.exec('123-abc'); console.log(match[1]); // 123 console.log(match[2]); // abc
在这个示例中,我们将字符串 '123-abc' 分成两个组:一个由数字组成的组和一个由字母组成的组。我们可以使用 match
数组的索引来引用这两个组。
使用 Named Capturing Groups,我们可以给这些组命名,如下所示:
const regex = /(?<number>\d+)-(?<letter>\w+)/; const match = regex.exec('123-abc'); console.log(match.groups.number); // 123 console.log(match.groups.letter); // abc
在这个例子中,我们使用 ?<name>
语法来给每个组命名,并使用 match.groups
对象来引用它们。这比使用索引更直观和简洁。
Unicode 范围的改进
ES10 对正则表达式的另一个改进是支持 Unicode 字符区间。在过去,字符区间仅限于 ASCII 字符。此外,使用 Unicode 字符时,必须采用特别的语法来引用它们。例如,要匹配字符 é,你需要这样写正则表达式:/\u00e9/
。
现在,你可以使用 \p{}
语法来引用 Unicode 字符范围。例如,/\p{Script=Greek}/u
将匹配任何希腊字母。
const regex = /([\p{Script=Latin}\p{Script=Cyrillic}]+)/u; const match = regex.exec('hello 你好 привет'); console.log(match[1]); // hello你好привет
在这个示例中,我们将正则表达式拆分成两个 Unicode 范围:拉丁字母和西里尔字母。我们使用 [\p{}]
语法来匹配这两个范围中的任何一个字符,并使用 u
标志来指示正则表达式是 Unicode 模式。
正则表达式的其他改进
除了 Named Capturing Groups 和 Unicode 范围之外,ES10 还引入了其他一些对正则表达式的改进。以下是其中的几个:
s 标志
之前,当在字符串中使用点号(.)匹配所有字符时,它不会匹配换行符。现在你可以使用 s 标志(单行模式)来匹配所有字符。
const regex = /hello.world/s; console.log(regex.test('hello\nworld')); // true
后行断言
未来我们可能需要让它自动换行,所以将敏感信息都擅自放在测试用例中建议不要这样做。
后行断言是一种新的功能,它允许你指定匹配必须在某个模式之后出现。例如,你可以使用后行断言来匹配文件扩展名。
const regex = /(?<=\.)(png|jpg)/; console.log(regex.test('picture.png')); // true
在这个示例中,我们使用 (?<=pattern)
语法来指定正则表达式必须在某个模式之后出现。在这种情况下,我们只匹配扩展名为 png 或 jpg 的文件,这些扩展名必须紧跟在点号(.)之后。
零宽度断言
零宽度断言是一种新的功能,它允许你指定匹配必须出现在另一个模式的前面或后面,而不消耗匹配的字符。例如,你可以使用零宽度断言来匹配以美元符号($)结尾的字符串。
const regex = /(?<=\d)\.(?=\d)/; console.log(regex.test('3.14')); // true
在这个示例中,我们使用 (?<=pattern)
和 (?=pattern)
语法来指定字符串必须在数字之后和数字之前有一个点号。使用了零宽度断言后,正则表达式仅匹配这个点号,但并不消耗任何字符。
结论
ES10 的正则表达式带来了一些新的语法和功能,使它们更加高效和易于阅读和维护。使用 Named Capturing Groups 和 Unicode 范围,你可以使用更直观和简洁的代码处理字符串。其他改进(如 s 标志、后行断言和零宽度断言)也将使正则表达式更有效率和可靠。了解这些新功能将有助于你编写更好的正则表达式,并提高你的前端开发技能。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67185618ad1e889fe22a48e3