JavaScript是世界上最受欢迎的编程语言之一,它可以构建现代Web应用程序。正则表达式(RegExp)是在JavaScript开发中广泛使用的一个重要功能。在ES9提案中,新增了RegExp Lookbehind的功能,这让我们有了更精细的正则表达式匹配能力。
什么是RegExp Lookbehind
在正则表达式中,回溯是指在匹配过程中正则表达式引擎需要回到前面的文本来进行匹配。回溯的概念不止是贪婪匹配相关,还包括先行和后行断言。
“先行断言”和“后行断言”是对于匹配字符串两侧的限制。JS中已有“先行断言”,当以x后面的字符为匹配内容时,可以通过写 (?=x) 来明确匹配的是x后面的内容。
ES9提案中添加的RegExp Lookbehind是后行断言,也称为后行逆序匹配(reverse lookup),就是匹配到某个字符之后,再根据其之前的内容来决定匹配结果。
具体来说,RegExp Lookbehind是指让正则表达式引擎向后检查字符串的内容,以确定匹配结果是否符合某些条件。以前行断言(?=)为例,比如要匹配 AAAB(AAA和B之间),假设通过匹配 AAA 来实现,无法和整个字符串匹配。但如果是 /(?<=AAA)B/ 就可以在匹配 B 时,向前检查字符串中的 AAA 是否存在,从而更好地匹配规则。
RegExp Lookbehind的语法
同ES8中向前检查,后行查找分为两种,一种是不捕获匹配内容的形式,另一种是捕获匹配内容。新的后行查找使用 (?<=...)
和 (?<!...)
进行声明,其中 ?<=
表示匹配含有括号中的项,?<!
表示不包含括号中的项。
(?<=y)x
表示匹配后面是y的x(?<!y)x
表示匹配后面不是y的x
使用 RegExp Lookbehind
下面,我们来看看RegExp Lookbehind的实际用法,以了解它的学习和指导意义。
示例1:转换驼峰为中划线
// 转换驼峰为中划线命名法 const camelCase = 'camelCaseNamingConvention'; const kebabCase = camelCase.replace(/(?<=[a-z])(?=[A-Z])/g, '-').toLowerCase(); console.log(kebabCase); // 'camel-case-naming-convention'
在这个示例中,我们使用 Lookbehind 来匹配正则表达式 /(?<=[a-z])(?=[A-Z])/g,用“-”替换掉任何小写字母后面的大写字母,完成字符串的驼峰到中划线的转换。
示例2:正则替换
// 正则表达式替换 const str = 'ES2018 is the latest version of ES.'; const replacedStr = str.replace(/(?<!ES)(?<!\d)(ES)/g, 'ECMA-$1'); console.log(replacedStr); // 'ECMA-ES2018 is the latest version of ECMA-ES.'
注意,这里是用 (?<!ES) 匹配了除了ES之外的单词,用 (?<!\d) 来匹配没有数字的位置,来达到替换的结果。
结论
ES9提案中的RegExp Lookbehind,是 JavaScript 开发者在处理字符串中更细致的匹配操作的一个重要规范。它可以让开发者更加灵活的掌控正则表达式的世界,为开发敲下更好的基础。
尽管它在实际应用中场景相对较少,但本文所列示的两个示例都是开发过程中经常会遇到的非常实用的技巧。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671c7a6f9babaf620fb0f26d