正则表达式 - Phone 数字(包括+,(,)和长度验证 - C#

Regular expression - Phone number ( including +, (,), and length validation - C#

最近我必须想出一个 phone 数字的正则表达式,因为许多开发人员已经这样做了,所以我找到了一个与之相关的解决方案。 并在生产中使用了相同的方法。

版本#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})?$"

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

这是我发现与使用正则表达式的 phone 数字验证长度相关的问题。

这里的示例可能是 123456789 - 想要将其标记为无效 phone 号码,因为它只有 9 位数字
此处的示例可能是 1234567890123456 - 想要将其标记为无效 phone 号码,因为它只有 16

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

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

您可以使用正则表达式,并在开头锚定 (?=(?:\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位
  • $ - 字符串结尾。