正则表达式匹配连续两个大写开头单词的问题求助
解决连续大写首词词组的重叠匹配问题
你的问题出在原正则的字符消耗机制上:([A-Z][a-z]+\s?){2}匹配时会把匹配到的字符直接消耗掉,所以匹配完「Expedition Runic」后,后续匹配的起点直接跳到了「Monster」,自然就跳过了「Runic Monster」这一组。
要实现重叠匹配,得用零宽度正向预查来避免消耗字符,推荐使用这个正则:
(?=([A-Z][a-z]+\s[A-Z][a-z]+))
效果说明
针对字符串「Expedition Runic Monster Markers」,开启全局匹配后,这个正则会从捕获组1中提取出三组结果:
- Expedition Runic
- Runic Monster
- Monster Markers
原理
正向预查(?=...)是零宽度断言,它只会检查当前位置后面是否符合匹配规则,不会移动正则的匹配指针,也不会消耗字符。所以匹配完第一组后,指针会回到「Runic」的开头,继续检查后续是否符合两个大写首词的规则,以此实现连续的重叠匹配。
注意事项
不同语言/工具里的使用细节略有不同:
- Python中,需要用
re.finditer遍历所有匹配结果,再提取每个结果的group(1) - JavaScript中要加上
g全局标志,然后通过循环获取所有捕获组内容
内容的提问来源于stack exchange,提问作者Felipe Gomez
相关产品推荐
相关产品推荐

