通过正则表达式提取数值时出现值截断问题该如何解决
正则提取值不完整问题解决方法
问题原因
你编写的正则中,末尾的(?<subGroupShopId>\\d+)是强制必填项,对于C2_S2_SH6917这类没有第二组G/SH后缀的字符串,正则为了完成全串匹配,会强制把groupShopId捕获的最后1位数字拆分给subGroupShopId,同时前面的分隔符匹配空值,最终导致groupShopId少一位。
修正方案
把后半段可选的子分组部分整体标记为可选,同时优化分隔符匹配逻辑,修正后的正则如下:
// 使用@逐字字符串可以避免写双重转义的反斜杠 public Regex testRegex = new Regex(@"^C(?<classId>\d+)_S(?<segmentId>\d+)_(?:G|SH)(?<groupShopId>\d+)(?:_(?:G|SH)(?<subGroupShopId>\d+))?$");
修正点说明
- 用
(?:)声明非捕获组,避免不必要的分组占用索引,不影响命名分组的取值 - 把
_G|_SH前缀 +subGroupShopId的整段用?标记为可选,没有这段内容时不会强制拆分前面的groupShopId值 - 取消了无意义的空分隔符匹配逻辑,避免出现异常拆分
匹配验证
修正后对所有测试用例的提取结果都符合预期:
C1_S2_G11_SH2761:groupShopId=11,subGroupShopId=2761C1_S1_G789:groupShopId=789,subGroupShopId为空C2_S2_SH6917:groupShopId=6917,subGroupShopId为空C1_S1_G78_G432:groupShopId=78,subGroupShopId=432
内容的提问来源于stack exchange,提问作者Denis S.
相关产品推荐
相关产品推荐

