为何我的RegEx正则表达式对部分字符串生效,对其他无效?
正则拆分失效问题解决
现有正则与代码
- 正则模式:
\b(?=<GTOL-[A-Z]*>) - C#执行代码:
Regex.Split(Text, @"\b(?=<GTOL-[A-Z]*>)").ToList();
能正常拆分的场景
输入字符串:<GTOL-POSI>.010<MOD-MMC>B-C<GTOL-POSI>.002<MOD-FMC>
拆分结果:
<GTOL-POSI>.010<MOD-MMC>B-C<GTOL-POSI>.002<MOD-FMC>
拆分失效的场景
场景1
输入字符串:<GTOL-POSI><MOD-DIAM>.004<MOD-MMC>HC<MOD-MMC><GTOL-POSI>.030<MOD-MMC>D-E<MOD-FMC>
预期拆分结果:
<GTOL-POSI><MOD-DIAM>.004<MOD-MMC>HC<MOD-MMC><GTOL-POSI>.030<MOD-MMC>D-E<MOD-FMC>
实际未按预期拆分
场景2
输入字符串:<GTOL-POSI><MOD-DIAM>.005<MOD-MMC>AD-E<MOD-MMC><GTOL-PERP>.001A
预期拆分结果:
<GTOL-POSI><MOD-DIAM>.005<MOD-MMC>AD-E<MOD-MMC><GTOL-PERP>.001A
实际未按预期拆分
问题根源及修复方案
问题出在\b(单词边界)的匹配逻辑上:
- 正常场景中,第二个
<GTOL-POSI>前面是字母C,<属于非单词字符,字母和非单词字符之间存在单词边界,\b能匹配到,所以拆分成功。 - 失效场景中,第二个
<GTOL-...>前面是>(非单词字符),<同样是非单词字符,两个非单词字符之间不存在单词边界,\b匹配失败,导致无法触发拆分。
修复方案:直接移除正则里的\b,修改后的正则为:(?=<GTOL-[A-Z]*>)
对应的C#代码:Regex.Split(Text, @"(?=<GTOL-[A-Z]*>)").ToList();
修改后,只要字符串中出现<GTOL-...>的起始位置,就会在该处拆分,所有场景都能符合预期。
内容的提问来源于stack exchange,提问作者Paniom
相关产品推荐
相关产品推荐

