我试图使用.NET正则表达式解析如下所示的字符串:
H3Y5NC8E-TGA5B6SB-2NVAQ4E0
并使用Split返回以下内容:H3Y5NC8E TGA5B6SB 2NVAQ4E0
我根据特定字符集验证每个字符(请注意,字母'I','O','U'和'W'不存在),因此使用string.Split不是一个选项.每组中的字符数可以变化,组的数量也可以变化.我使用以下表达式:
([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8}-?){3}
这将恰好匹配3组,每组8个字符.任何或多或少都会使比赛失败.只要它正确匹配输入,这是有效的.但是,当我使用Split方法提取每个字符组时,我只得到最后一组.RegexBuddy抱怨我已经重复了捕获组本身,我应该在重复组周围放置一个捕获组.但是,我没有尝试这样做能达到预期的效果.我一直在尝试这样的表达式:
(([ABCDEFGHJKLMNPQRSTVXYZ0123456789]{8})-?){4}
但这不起作用.
由于我在代码中生成正则表达式,我可以通过组的数量来扩展它,但我希望有一个更优雅的解决方案.
请注意,字符集不包括整个字母表.它是产品激活系统的一部分.因此,可以删除任何可能被意外解释为数字或其他字符的字符.例如字母'I','O','U'和'W'不在字符集中.
连字符是可选的,因为用户不需要顶部输入,但如果用户完成了复制和粘贴,它们就可以在那里.
顺便说一下,您可以用更易读的减去字符类替换[ABCDEFGHJKLMNPQRSTVXYZ0123456789]字符类.
[[A-Z\d]-[IOUW]]
如果您只想匹配3个这样的组,为什么不在正则表达式中使用此模式3次并仅使用捕获的1,2,3个子组来形成新字符串?
([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}-([[A-Z\d]-[IOUW]]){8}
在PHP我会回来(我不知道.NET)
return "$1 $2 $3";