正则表达式无法正确分离标题与标签分组的问题排查咨询
正则表达式无法正确分离标题与标签分组的问题排查咨询
看起来你遇到的核心问题是正则里的贪婪匹配在搞鬼!让我一步步给你拆解问题所在,再给出修正方案:
原正则的问题分析
你写的正则:
([0-9]+)([rp][0-9]{4,})(.*)([A-Z]{2,}_?[A-Z,0-9]{2,},)
其中的(.*)是贪婪量词,它会尽可能多地匹配字符,直到后面的标签模式([A-Z]{2,}_?[A-Z,0-9]{2,},)能找到最后一个匹配项为止。这就导致它把标题后面的大部分标签都“吞”进了第三组(标题组),只把最后几个标签留给第四组,完全不符合你想要的“标题结束后全是标签”的预期。
另外,原正则的标签分组只能匹配单个标签,没法一次性捕获所有连续的标签内容,这也是一个小问题。
修正后的正则方案
我们需要把贪婪匹配改成非贪婪匹配,同时调整标签分组的逻辑,让它能捕获所有连续的标签:
([0-9]+)([rp][0-9]{4,})(.*?)\s*([A-Z]{2,}_?[A-Z0-9]+(?:,\s*[A-Z]{2,}_?[A-Z0-9]+)*,)
各部分的作用解释
([0-9]+):匹配第一组数字ID,和原逻辑一致,没问题([rp][0-9]{4,}):匹配第二组p/r开头的ID,同样保持原逻辑(.*?)\s*:把原来的贪婪.*改成非贪婪的.*?,它会匹配尽可能少的字符,直到后面的标签模式第一次出现;\s*用来吃掉标题和第一个标签之间的空格,让第三组的标题更干净([A-Z]{2,}_?[A-Z0-9]+(?:,\s*[A-Z]{2,}_?[A-Z0-9]+)*,):这个部分专门匹配所有连续的标签:[A-Z]{2,}_?[A-Z0-9]+:匹配单个符合规则的标签(至少2个大写字母,可选下划线,后面跟大写字母/数字)(?:,\s*[A-Z]{2,}_?[A-Z0-9]+)*:匹配“逗号+可选空格+下一个标签”的重复模式,(?:...)是非捕获组,不会生成额外的分组- 末尾的
,匹配标签列表最后的逗号
测试结果
用你的输入文本测试,分组结果会完全符合预期:
04040p0015Macro drive object / Macro DOSERVO, VECTOR, HLA, SERVO_AC, VECTOR_AC, SERVO_I_AC, VECTOR_I_AC, A_INF, S_INF, R_INF, B_INF, TM31, TM15DI_DO, TM120, TM150,
备注:内容来源于stack exchange,提问作者Oblomov
相关产品推荐
相关产品推荐

