我正在使用正则表达式解决验证问题.下面的正则表达式将只接受以 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 或 my 开头
我能够部分实现,但这个正则表达式允许数据何时进入NH11111111(允许将 N 和 H 作为前两个字符,后跟八个 1)。是否有可能更改正则表达式,以便它只接受hn,hN,Hn,HN,my,mY,My,MY而不是NH,YM(反向组合)
有效字符串
- HN11111111
- MY11111111
- hn23456789
- my23456789
- hN23456789
- 我的23456789
无效字符串
- HY11111111
- HM11111111
- HM111111
- NH11111111
- YM11111111(目前允许倒数第二和倒数第二)。
提前感谢(我正在使用 .NET 4.5)。
您的正则表达式^[HN|hn]{2}|[MY|my]{2}[0-9]{8}
是"损坏的",至少因为两件事:
- 没有分组构造的
|
交替算子将模式"拆分"为两个备选方案,一个(^[HN|hn]{2}
)匹配H
,h
,N,
nor
|twice at the start of the string (and it can be followed with anything), and the
[MY|my]{2}[0-9]{8}part matches
M,
m,
Y,
yor
|' 两次,然后是字符串内任意位置的任意 8 位数字(请参阅此正则表达式演示) [HN|hn]
匹配单个字符,因为[...]
定义字符类,而不是一组替代模式。您需要使用圆括号,(...)
(捕获)或(?:...)
(非捕获)。
您可以使用
var rx = new Regex(@"^(?:HN|hn|MY|my)[0-9]{8}$");
查看此正则表达式演示
详
^
- 字符串的开头(?:HN|hn|MY|my)
-HN
、MY
、hn
、my
子串[0-9]{8}
- 8 位数字$
- 字符串的结尾。