【问题标题】:Regular expression : match either of two conditions?正则表达式:匹配两个条件之一?
【发布时间】:2016-09-21 09:49:19
【问题描述】:

您好,我对正则表达式了解不多。但我在使用 angularJs 进行表单验证时需要它。

以下是要求

输入框应该只接受以下任一情况

(1) 前 2 个字母 alpha + 6 个数字

(2) 8 个数字

以下是一些正确的输入:-

(1)SH123456 (2)12345678 (3)sd456565

我试过 data-ng-pattern="/(^([a-zA-Z]){2}([0-9]){6})|([0-9]*)?$/" ,它在上述两种情况下都可以正常工作,但它仍然可以接受像 S2D3E4F5 这样的字符串,并且可能还有许多其他组合。

我做错了什么我无法找到它。

任何帮助都是可观的!!!

谢谢

【问题讨论】:

标签: javascript angularjs regex angularjs-ng-pattern


【解决方案1】:

在您的正则表达式中,两个替代分支分别锚定:

  • (^([a-zA-Z]){2}([0-9]){6}) - 字符串开头的 2 个字母和 6 个数字
  • | - 或
  • ([0-9]*)?$ - 字符串末尾的可选零个或多个数字

你需要调整组的边界:

data-ng-pattern="/^([a-zA-Z]{2}[0-9]{6}|[0-9]{8})?$/"
                   ^                         ^^^^ 

请参阅regex demo

现在,模式将匹配:

  • ^ - 字符串开头
  • ( - 分组开始:
    • [a-zA-Z]{2}[0-9]{6} - 2 个字母和 6 个数字
    • | - 或
    • [0-9]{8} - 8 位数字
  • )? - 分组结束和 ? 量词使其匹配 1 或 0 次(可选)
  • $ - 字符串结束。

【讨论】:

  • @revo:如果有人对您的答案投了反对票,那么他们可能有问题。我没有表达任何担忧,我只是要求“建设性的批评”。当给出的答案详细、有效且有用时,普通的反对票不会增加价值。
  • 在正常情况下这是正确的,但不是收到反对票的时候。如果我再次看到同样的行为,我肯定会照我说的做。
  • @revo 请现在就做。
  • 我肯定会这样做,但在我确定我的投诉会得到考虑的更合适的时间。
【解决方案2】:

你可以试试这个DEMO LINK HERE

^(([a-zA-Z]{2}|[0-9]{2})[0-9]{6})?$

它将接受:

  1. ab123456
  2. 12345678
  3. aa441236
  4. aw222222

【讨论】:

  • 它在语义上和我的一样,所以它也可以工作。形式上的区别是这里只使用了 1 个嵌套捕获组,而我的没有嵌套组。两者的性能相似。
  • 6 个数值在这两种情况下都很常见。这就是为什么我对 6 个数值使用公共部分的原因。并且有很多方法可以编写正则表达式。 :)
  • 似乎相当于^([a-zA-Z0-9]{2}[0-9]{6})?$
  • 没有。你的表达也将除了 a1234567。但它需要前 2 个字母 alpha + 6 @jensgram
猜你喜欢
  • 1970-01-01
  • 2011-10-15
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多