如何结合这些正则表达式的要求?

时间:2013-07-17 11:06:34

标签: regex

我正在使用Asp.Net RegularExpressionValidator验证电话号码。

支票非常基本 - 一个数字长度可以是10或11个字符,全部是数字,从01或02开始。

这是正则表达式:

^0[12]\d{8,9}$

但是,我最近开始与第三方合作,执行更严格的规则。在我看来,这是一个坏主意 - 部分是因为他们甚至没有公布这些规则,而且它们可能会受到变化,因此可以在所有合作伙伴中进行维护。然而...

我现在需要将他们的添加内容添加到我的正则表达式中,但我不知道从哪里开始。

他们目前在OR中使用2个单独的正则表达式执行此操作,但是如果可能的话,我想在1中执行此操作。

附加语法应确保10位数的电话号码也符合这些附加规则 - 这是他们的10位数语法。

"^01(204|208|254|276|297|298|363|364|384|386|404|420|460|461|480|488|524|527|562|566|606|629|635|647|659|695|726|744|750|768|827|837|884|900|905|935|946|949|963|995)[0-9]{5}$ 

关于如何实现这一点的任何想法?

2 个答案:

答案 0 :(得分:2)

  

免责声明:此答案基于this answer后面的逻辑来演示“虚拟”要求(我们应该放弃这些要求)。

让我解释一下发生了什么:
^0[12]\d{8,9}$这里发生了什么?

  • ^:匹配行的开头
  • 0:匹配0
  • [12]:匹配12
  • \d{8,9}:匹配数字8或9次
  • $:匹配行尾

^01(204|20...3|995)[0-9]{5}$这个大正则表达式做了什么?

  • ^:匹配行的开头
  • 01:匹配01
  • (204|20...3|995):匹配某个3位数组合
  • [0-9]{5}:匹配数字5次
  • $:匹配行尾

那么,如果我们在OR语句中合并这两个怎么办?

^
   (?:
       01(204|20...3|995)[0-9]{5}
   )
   |
   (?:
        0[12]\d{8,9}
    )
$

我会告诉你为什么它没有意义。
0[12]\d{8,9}匹配多少位数? 10或11对吗? 现在另一个正则表达式匹配多少位数?

01(204|20...3|995)[0-9]{5}
^^ ^-----\/-----^ ^--\/--^
2    +    3      +    5     =   10

现在,如果我们比较2个正则表达式。很明显,^0[12]\d{8,9}$将匹配对其他正则表达式有效的所有数字。那么为什么世界上你会把这两个结合起来呢?

为了简化问题,请说你有regex1:abc,regex2:[a-z]+。您想要的是abc|[a-z]+,但由于[a-z]+abc匹配,因此没有意义,因此我们可以搭乘abc

旁注,\d does match more比您在某些语言中的想法要多。您的最终正则表达式应为^0[12][0-9]{8,9}$

答案 1 :(得分:1)

您可以将它们与正则表达式中的OR合并:

^(?:01(204|208|254|276|297|298|363|364|384|386|404|420|460|461|480|488|524|527|562|566|606|629|635|647|659|695|726|744|750|768|827|837|884|900|905|935|946|949|963|995)\d{5}|0[12]\d{9})$

编辑了11位正则表达式。