如何避免.NET 8正则表达式中第一个捕获组被忽略?
问题分析与修复
原正则的问题出在(?<CODE>[X][B|M]\d{6}[A-Z]|[a-z]?)这个命名组里的[a-z]?分支——它允许匹配空字符串。当处理第二行 FOB NUMBER时,开头空格后没有符合XB/XM\d{6}[A-Z]的内容,[a-z]?直接匹配空,后续\s+匹配FOB前的空格,(?<NAME>.+)就把FOB NUMBER全部捕获,导致整行被错误匹配。
修复方案
根据需求“确保先捕获第一个命名组,再捕获第二个”,意味着CODE组必须匹配有效内容,不能允许空匹配。需调整CODE组的规则:
情况1:CODE只能是XB/XM开头的编码
如果[a-z]?是误加的,直接移除这个分支,正则改为:
^\s+(?<CODE>X[BM]\d{6}[A-Z])\s+(?<NAME>.+)$
这样只有符合XBXXXXXXA或XMXXXXXXA格式的行才会被匹配,第二行因无有效CODE会被过滤。
情况2:CODE允许是XB/XM开头的编码或单个小写字母
如果确实需要支持单个小写字母作为CODE,把[a-z]?的?去掉(改为必填),正则改为:
^\s+(?<CODE>X[BM]\d{6}[A-Z]|[a-z])\s+(?<NAME>.+)$
此时第二行的FOB是大写字母,无法匹配CODE组的任何分支,整行不会被匹配。
测试验证
用修复后的正则匹配示例字符串:
- 第一行
XM204000B 200 SUNSHINE RD & PALACE:CODE组捕获XM204000B,NAME组捕获200 SUNSHINE RD & PALACE,正常匹配。 - 第二行
FOB NUMBER:无法匹配CODE组的有效规则,整行不会被匹配,符合需求。
另外补充:原正则里的[B|M]写法冗余,方括号内的|是普通字符,直接写成[BM]即可,功能完全一致且更简洁。
内容的提问来源于stack exchange,提问作者Jlong101
相关产品推荐
相关产品推荐

