正则表达式全局匹配问题:避免分隔符被消耗实现连续匹配
解决方案
用**正向预查(零宽度断言)**就能解决数字被消耗的问题,无需预处理添加特殊分隔符。
适用的正则表达式
(?s)\n(\d{1,3}(?:(?!\n999).)*)(?=\n\d|$)
原理说明
(?s):开启单行模式,让.可以匹配换行符,支持跨多行匹配内容\n(\d{1,3}(?:(?!\n999).)*):匹配换行后开头的1-3位数字,然后匹配后续所有内容,直到遇到结束标记\n999为止(?=\n\d|$):正向预查,仅检查后续是否是换行+数字或者文本结尾,不会消耗该数字,确保下一次匹配能直接从下一个数字开头的位置开始
为什么之前的正则不行
你之前用的(?s)\n(\d{1,3}.*?)\d会把下一个块的开头数字当作结束符消耗掉,导致下一次匹配只能从该数字之后的位置开始,所以只能拿到交替的结果。而正向预查是零宽度的,不会占用匹配位置,完美解决了这个问题。
内容的提问来源于stack exchange,提问作者u936293
相关产品推荐
相关产品推荐

