如何从可重复的正则捕获组中提取所有匹配子串?(PCRE2场景)
问题根因
你当前写法的问题属于正则捕获组的通用特性:重复的捕获组只会保留最后一次匹配的结果。你写的(?::(.*?))*是重复匹配:加内容的结构,每一次匹配都会覆盖$2的取值,所以最终只能拿到最后一段的内容,中间的全部会被覆盖。
适配PCRE2的解决方案
分两种场景选择合适的写法:
场景1:提前知道分隔后的字段数量
如果业务中能确定每次要匹配的字符串固定包含N个冒号分隔的字段,直接写对应数量的捕获组即可,比如4个字段的写法:
^(\w+):(\w+):(\w+):(\w+)$
匹配后$1到$4会依次对应4个分割后的取值,3个字段就调整为3个捕获组即可。
场景2:字段数量不固定
这种场景不要尝试用单次匹配的多捕获组实现,开启PCRE2的全局匹配标记PCRE2_GLOBAL,使用极简匹配规则:
[^:]+
每次匹配返回一个冒号分隔的片段,按顺序读取所有全局匹配结果,即可得到全部分割后的内容,无需依赖捕获组编号,适配任意数量的分隔字段。
内容的提问来源于stack exchange,提问作者Cody
相关产品推荐
相关产品推荐

