添加Named Capture Group后正则仅匹配3条,如何恢复4条匹配?
问题解决:添加命名捕获组后丢失匹配的修复
问题原因
原正则中的([-\/\\.])是第一个捕获组,用\1反向引用确保日期分隔符一致;但在外层添加命名捕获组(?<myPattern>...)后,这个分隔符捕获组变成了第二个捕获组,此时\1会错误引用命名捕获组的内容,导致反向引用逻辑失效,无法正确排除日期格式字符串,最终丢失一条匹配。
修复方案
有两种可行的修复方式:
方式1:调整反向引用的捕获组编号
将原正则中的\1改为\2,对应现在的分隔符捕获组位置:
(?<myPattern>\b\d(?!(?:\d{0,3}([-\/\\.])\d{1,2}\2\d{1,4})\b(?!\S))(?:[^\n\d\$\.\%]*\d){14}\b)
方式2:将分隔符捕获组改为命名捕获组(更易维护)
把分隔符的捕获组改为命名形式,用命名引用替代数字引用,避免捕获组顺序变化带来的问题:
(?<myPattern>\b\d(?!(?:\d{0,3}(?<sep>[-\/\\.])\d{1,2}\k<sep>\d{1,4})\b(?!\S))(?:[^\n\d\$\.\%]*\d){14}\b)
两种方式都能保留命名捕获组myPattern,同时恢复4条匹配的结果。
内容的提问来源于stack exchange,提问作者DanielAttard
相关产品推荐
相关产品推荐

