我正在使用Regex处理验证问题。以下正则表达式只接受以HN或MY开头的数据,后跟8位数字。但它也接受NH或YM组合。如何防止?
Regex reg;
reg = new Regex(@"^[HN|hn]{2}|[MY|my]{2}[0-9]{8}");
条件 - 总长度10(2个字符+8位数) - 从HN或hn或MY或我的
开始我能够部分实现,但这个正则表达式允许数据进入时 NH11111111 (允许N和H作为前两个字符,然后是8个1)。有没有可能改变正则表达式,所以它应该只接受 hn,hN,Hn,HN,my,mY,My,MY 而非 NH,YM(反向组合)
有效字符串
无效字符串
提前致谢(我使用的是.NET 4.5)。
答案 0 :(得分:1)
你的正则表达式^[HN|hn]{2}|[MY|my]{2}[0-9]{8}
因为至少两件事而“腐败”:
|
交替运算符将模式“拆分”为两个选项,一个(^[HN|hn]{2}
)匹配H
,h
,N {{1} } N ,
| or
[MY |我] {2} [0-9] {8} twice at the start of the string (and it can be followed with anything), and the
M part matches
微,
ý{{1 } {y} ,
|`两次,然后是字符串内任意位置的任意8位数(参见this regex demo),
与单字符匹配,因为or
定义了字符类,而不是一组替代模式。您需要使用圆括号[HN|hn]
(捕获)或[...]
(非捕获)。您可以使用
(...)
<强>详情
(?:...)
- 字符串开头var rx = new Regex(@"^(?:HN|hn|MY|my)[0-9]{8}$");
- ^
,(?:HN|hn|MY|my)
,HN
,MY
substring hn
- 8位数字my
- 字符串结束。