【问题标题】:Regular expression - Phone number ( including +, (,), and length validation - C#正则表达式 - 电话号码(包括 +、(,) 和长度验证 - C#
【发布时间】:2017-12-16 17:15:05
【问题描述】:

最近我想出了一个电话号码的正则表达式,因为许多开发人员已经这样做了,我找到了一个与之相关的解决方案。 并在生产中使用它。

版本#1只有数字:

@"\(?\d{3}\)?-? *\d{3}-? *-?\d{4}"

但是还有一个额外的要求:我们需要允许像-(这样的特殊字符)
所以我将正则表达式修改为 Version#2 如下所述:

@"^([\+]?[0-9]{1}[0-9]{0,2})[\s-]?[\(]?(0?[0-9]\d{0,4}[\)]?[-\s]?)([0-9][\d-\s]{5,7}[\s]?)(x[\d-]{0,4})?$"

现在,在验证电话号码的长度时,QA 发现它可以接受超过 16 个字符,我必须再次处理正则表达式以使其正常工作。

这是我发现与使用正则表达式验证电话号码长度有关的问题。

  • 有没有办法通过修改正则表达式来表明电话号码应该接受最小长度为10,最大长度为15?

此处的示例可能是 123456789 - 要将其标记为无效电话号码,因为它只有 9
此处的示例可能是 @ 987654329@ - 想要将此标记为无效电话号码,因为它只有 16 位数字

  • 有没有办法通过修改正则表达式来表示电话号码内的单左括号和单右括号无效?

此处的示例可能是 12(34567890 - 想要将其标记为无效电话号码,因为它只有 左括号

目前,我通过向电话号码字段添加自定义属性来实现上述目标。我真的很想知道,是否有办法通过修改正则表达式本身来实现上述目标?

【问题讨论】:

  • 您可以使用一种替代方式,一种匹配括号中的数字,另一种匹配不带括号的数字。
  • 您是否尝试仅允许 10 到 15 位数字 (demo)?或者整个字符串长度可以是 10 到 15 个字符 (demo)?
  • 您能再发布一些测试数据吗? (我不太了解不同的电话号码格式)
  • 你为什么要为此制作一个困难的正则表达式?我的意思是..如果您在任何电话中拨打任何号码,您将不会输入特殊字符,可能除了加号。我会简单地将所有内容过滤掉,这不是数字并在之后对其进行格式化。
  • 如果您将 Version#2 更改为 ^(\+?\d{1,3})[\s-]?\(?(0?\d{1,5}\)?[-\s]?)(\d[\d-\s]{5,7}\s?)(x[\d-]{0,4})?$,它会更易于阅读(并且可以排成一行)。和你的意思一模一样,只是删减了一些东西。

标签: c# regex phone-number


【解决方案1】:

您可以使用带有(?=(?:\D*\d){10,15}\D*$) 正则前瞻的正则表达式,并在开头锚定:

^(?=(?:\D*\d){10,15}\D*$)\+?[0-9]{1,3}[\s-]?(?:\(0?[0-9]{1,5}\)|[0-9]{1,5})[-\s]?[0-9][\d\s-]{5,7}\s?(?:x[\d-]{0,4})?$

请参阅regex demo

详情

  • ^ - 字符串开头
  • (?=(?:\D*\d){10,15}\D*$) - 正向前瞻,确保有 10 到 15 个非数字序列后跟 1 个数字,然后在字符串末尾有 0+ 个数字
  • \+? - 一个可选的 + 符号
  • [0-9]{1,3} - 1 到 3 位数字
  • [\s-]? - 可选空格或-
  • (?:\(0?[0-9]{1,5}\)|[0-9]{1,5}) - 两种选择之一:
    • \(0?[0-9]{1,5}\) - (,1 到 5 位数字,)
    • | - 或
    • [0-9]{1,5} - 1 到 5 位数字
  • [-\s]? - 可选空格或-
  • [0-9] - 一个数字
  • [\d\s-]{5,7} - 5 到 7 位数字、空格或 -
  • \s? - 可选空格
  • (?:x[\d-]{0,4})? - 可选序列:
    • x - 文字 x
    • [\d-]{0,4} - - 的 0 到 4 位数字
  • $ - 字符串结束。

【讨论】:

  • (?=(?:\D*\d){10,15}\D*$) - 确保有 10 到 15 个数字序列的正向预测,对吗?不是非数字不是吗?
  • @VenkataramanaMadugula;我已经写了它的意思。 \D* 匹配零个或多个非数字(以允许空格、连字符等。您的 消费 模式 - 不在前瞻内的模式 - 匹配)并且 \d 匹配一个数字.一旦分组和量化为(?:\D*\d){10,15},整个\D*\d 重复10 到15 次:\D*\d(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)(?:\D*\d)?(?:\D*\d)?(?:\D*\d)?(?:\D*\d)?(?:\D*\d)?
  • 前瞻在字符串中需要 10、11、12、13、14 或 15 位数字,不多也不少。如果条件不满足,引擎甚至不会尝试将字符串与模式的其余部分匹配。
猜你喜欢
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
  • 2015-10-23
  • 1970-01-01
  • 2013-08-23
相关资源
最近更新 更多