与正则表达式

时间:2018-02-14 10:58:13

标签: .net regex

我正在使用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(反向组合)

有效字符串

  • HN11111111
  • MY11111111
  • hn23456789
  • my23456789
  • hN23456789
  • My23456789

无效字符串

  • HY11111111
  • HM11111111
  • HM111111
  • NH11111111
  • YM11111111 (目前允许使用最后和最后一个)。

提前致谢(我使用的是.NET 4.5)。

1 个答案:

答案 0 :(得分:1)

你的正则表达式^[HN|hn]{2}|[MY|my]{2}[0-9]{8}因为至少两件事而“腐败”:

  • 没有分组构造的|交替运算符将模式“拆分”为两个选项,一个(^[HN|hn]{2})匹配Hh,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](捕获)或[...](非捕获)。

您可以使用

(...)

请参阅this regex demo

<强>详情

  • (?:...) - 字符串开头
  • var rx = new Regex(@"^(?:HN|hn|MY|my)[0-9]{8}$"); - ^(?:HN|hn|MY|my)HNMY substring
  • hn - 8位数字
  • my - 字符串结束。