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

标签 c# regex phone-number

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

Version#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 位数字
此处的示例可能是 1234567890123456 - 想要将此标记为无效电话号码,因为它只有 16 位数字

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

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

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

最佳答案

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

关于c# - 正则表达式 - 电话号码(包括+,(,)和长度验证 - C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45054921/

相关文章:

c# - 无法使序列化信息出现在 XML 中

c# - 为类型 T 的复杂对象创建自定义比较器

c# - 如何从代码以兼容模式执行程序?

c++ - 检查两个正则表达式是否相等/同构的库

ios - iOS 上的字符串到电话号码格式

android - 不使用 ACTION_PHONE_STATE_CHANGED 获取当前来电者电话号码

c# - 如何将 en-US 日期更改为 en-GB for asp.net?

javascript - IP 地址验证的正则表达式

python - 理解Python中的正则表达式分隔符、sub、

用于检测拨出电话号码的 Android 应用程序崩溃