在 ES9 中,正则表达式得到了很多新的特性,其中一个重要的特性就是后行断言(Lookbehind)。后行断言是指在匹配字符串时,只有当前位置之前的字符串满足断言的条件,才会继续往下匹配。这个特性在处理一些复杂的字符串匹配问题时非常有用。
后行断言的语法
后行断言的语法非常简单,只需要在正则表达式中加上 (?<=...)
这样的语法即可。其中 ...
表示需要满足的条件,可以是任意的正则表达式。
例如,我们可以使用后行断言来匹配一个字符串中所有以 $
结尾的单词:
const str = 'foo bar$ baz$ qux$'; const regex = /(?<=\b\w+)\$/g; console.log(str.match(regex)); // ['$','$','$']
在这个例子中,(?<=\b\w+)
表示需要匹配的字符串必须满足前面是一个单词的条件,然后再匹配以 $
结尾的字符串。
后行断言的应用
后行断言在实际开发中有很多应用场景,下面我们来看几个例子。
匹配多行字符串中的某一行
在处理多行字符串时,我们经常需要提取其中的某一行。使用后行断言可以非常方便地实现这个功能。例如:
const str = `foo bar baz qux`; const regex = /(?<=^|\n)bar\n/g; console.log(str.match(regex)); // ['bar\n']
在这个例子中,(?<=^|\n)
表示需要匹配的字符串必须满足前面是字符串的开头或者换行符的条件,然后再匹配 bar
这一行。
匹配某一行的前缀或后缀
有时候我们需要匹配某一行中的前缀或后缀。使用后行断言可以很容易地实现这个功能。例如:
const str = `foo bar baz qux`; const regex = /(?<=^|\n)bar(?=:)/g; console.log(str.match(regex)); // ['bar']
在这个例子中,(?<=^|\n)
表示需要匹配的字符串必须满足前面是字符串的开头或者换行符的条件,然后再匹配 bar
这一行的前缀。
匹配某个字符后面的字符串
有时候我们需要匹配某个字符后面的字符串。使用后行断言可以很容易地实现这个功能。例如:
const str = 'foo bar$ baz$ qux$'; const regex = /(?<=\$)\s*\w+/g; console.log(str.match(regex)); // ['baz', 'qux']
在这个例子中,(?<=\$)
表示需要匹配的字符串必须满足前面是 $
的条件,然后再匹配后面的单词。
注意事项
需要注意的是,后行断言目前只有 Chrome 和 Firefox 支持,其他浏览器暂不支持。同时,后行断言只支持固定宽度的断言,也就是说,后行断言中不能使用量词或者 .
这样的通配符。
总结
后行断言是一个非常有用的特性,可以帮助我们更方便地处理一些复杂的字符串匹配问题。在使用后行断言时,需要注意浏览器的兼容性以及固定宽度的限制。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/653b87aa7d4982a6eb5de23d