2013-07-17 51 views
0

我正在使用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}$ 

有关如何实现此目的的任何想法?

+0

您是否检查输入是否符合'regex1' ** AND **'regex2'或'regex1' **或**'regex2'? – HamZa

+0

它只能是10或11位数字 – dotnetnoob

+0

您没有得到我的问题。如果它只能是10或11个数字,那么'[0-9] {10,11}'就可以完成这项工作。我在问你怎么检查这两个正则表达式?你在if语句中使用'and'还是'or'? – HamZa

回答

1

你可以在正则表达式本身具有或合并其中:

^(?: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位的正则表达式。

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

在旁注中,\ddoes match more比你想象的有些语言。你的最终正则表达式应该是^0[12][0-9]{8,9}$

+1

HamZa - 你没有注意到最终的正则表达式已经改变,所以{8,9}变成了{9}。我确实接受了你对\ d的评论,并在最终的正则表达式中用[0-9]代替。 – dotnetnoob

+0

我确实看到它,但我非常专注于OR部分,我完全忽略了它。我确实失败了:P – HamZa