JavaScript正则正向预查:双abc场景为何匹配第一个abc前置内容?
正则匹配问题解答
你的问题核心在于正则的默认匹配规则和贪婪特性:
- 首先,正则里的
.默认不匹配换行符
你的输入文本是:
test abc abc
test后面跟着换行符,然后才是abc abc。.+作为贪婪量词,会尽可能多匹配,但因为.不能识别换行,所以只能匹配到换行前的test ,此时换行后的第一个abc刚好满足正向预查(?=abc)的条件,所以最终匹配的是第一个abc的前置内容。
- 如何匹配到最后一个
abc的前置内容?
如果你想获取到第二个abc之前的所有内容,需要让.能匹配换行符:
- 开启正则的DOTALL模式(不同语言里开启方式不同,比如Python里加
re.DOTALL参数) - 或者用
[\s\S]+代替.(\s匹配含换行的空白字符,\S匹配非空白字符,合起来覆盖所有字符),写成[\s\S]+(?=abc),这样就能匹配到test \nabc。
- 如果想获取每个
abc的前置内容
需要用非贪婪量词.*?并开启全局匹配,正则写成.*?(?=abc),这样就能分别匹配到test和第二个abc前的空格。
内容的提问来源于stack exchange,提问作者user310291
相关产品推荐
相关产品推荐

