如何指定正则分组的结束边界以提取重复分组间的目标内容
正则匹配方案
你之前的写法出现匹配范围过大的问题,核心是.*默认采用贪婪匹配规则,会尽可能多的匹配符合条件的字符,所以会从第一个dog一直匹配到整个文本最后一个cat的位置,不会在遇到第一个cat时停止。你尝试的(?s)(?:dog.*(cat){1})写法也没有解决问题,原因是{1}仅限制cat匹配一次,不会改变前面.*的贪婪特性,正则还是会先让.*匹配尽可能多的内容,再回头匹配最后一个cat,匹配范围还是覆盖了从第一个dog到最后一个cat的全部内容。
可用正则写法
你可以用非贪婪匹配+正向预查的方案,直接提取cat和下一个dog(或文本末尾)之间的内容,正则表达式如下:
(?s)cat\r?\n(.*?)(?=\r?\ndog|\Z)
规则说明
(?s):开启单行匹配模式,让.可以匹配换行符cat\r?\n:匹配cat所在行的末尾,兼容Windows和Unix换行格式(.*?):非贪婪匹配任意字符,捕获分组1的内容就是你需要提取的目标内容(?=\r?\ndog|\Z):正向零宽预查,匹配到下一个dog开头的行或者文本结束位置就终止,不会将dog纳入匹配结果
匹配结果
对示例文本执行匹配后,依次提取所有捕获分组1的内容,拼接后即可得到你需要的输出:
123 XYZ 456 ABC 789
内容的提问来源于stack exchange,提问作者Lars
相关产品推荐
相关产品推荐

