正则表达式 - 电话号码(包括+,(,)和长度验证 - C#

时间:2017-07-12 10:18:52

标签: c# regex phone-number

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

版本#1 仅包含数字:

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

但是还有一项要求:我们需要允许使用-( )等特殊字符。 所以我将正则表达式修改为版本#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 位数
这里的示例可以是1234567890123456 - 想要将其标记为无效的电话号码,因为它只有 16 数字

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

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

目前,我通过在电话号码字段中添加自定义属性来实现上述目标。我真的想知道,如果我们可以通过修改正则表达式来实现上述目标吗?

1 个答案:

答案 0 :(得分: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+个数字直到字符串结尾 < / LI>
  • \+? - 可选的+符号
  • [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位数字
  • $ - 字符串结束。