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}$ 

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

4

2 回答 2

2

免责声明:此答案基于此答案所遵循的逻辑,演示“虚拟”要求(无论如何我们都应该放弃)。

让我解释一下发生了什么:
^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 确实比您想象的要匹配更多。你的最终正则表达式应该是^0[12][0-9]{8,9}$.

于 2013-07-17T13:50:18.313 回答
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 位正则表达式。

于 2013-07-17T11:13:11.420 回答