【问题标题】:How to combine these regex requirements?如何结合这些正则表达式要求?
【发布时间】:2013-07-17 11:06:33
【问题描述】:

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

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

【问题讨论】:

  • 您是否在检查输入是否符合regex1 AND regex2regex1 OR regex2
  • 只能是10位或11位数字
  • 你没有得到我的问题。如果它只能是 10 位或 11 位数字,那么 [0-9]{10,11} 就可以了。我在问你如何检查两个正则表达式?您在 if 语句中使用的是 and 还是 or
  • 我觉得这个问题完全有道理,但是如果有人认为应该关闭它,请勇敢地给出一个理由!
  • 我正在使用单个 Asp.Net 验证器 - 正则表达式。

标签: regex


【解决方案1】:

免责声明:此答案基于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

现在如果我们比较两个正则表达式。很明显,^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}$

【讨论】:

  • HamZa - 您没有注意到最终的正则表达式已更改,因此 {8,9} 已变为 {9}。我确实接受了你所说的关于 \d 的内容,并在最终的正则表达式中替换为 [0-9]。
  • 我确实看到了,但我太专注于 OR 部分,以至于完全忽略了它。我确实失败了:P
【解决方案2】:

您可以将它们与正则表达式本身中的 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 位正则表达式。

【讨论】:

    猜你喜欢
    • 2012-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-04-28
    • 2022-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-24
    相关资源
    最近更新 更多