正则表达式的反向组合问题



我正在使用正则表达式解决验证问题.下面的正则表达式将只接受以 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})匹配Hh,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 matchesM,m,Y,yor|' 两次,然后是字符串内任意位置的任意 8 位数字(请参阅此正则表达式演示)
  • [HN|hn]匹配单个字符,因为[...]定义字符类,而不是一组替代模式。您需要使用圆括号,(...)(捕获)或(?:...)(非捕获)。

您可以使用

var rx = new Regex(@"^(?:HN|hn|MY|my)[0-9]{8}$");

查看此正则表达式演示

  • ^- 字符串的开头
  • (?:HN|hn|MY|my)-HNMYhnmy子串
  • [0-9]{8}- 8 位数字
  • $- 字符串的结尾。

最新更新