【问题标题】:Regex of phone number - how to make sure the user won't put +-*+-*+-*+-*?电话号码的正则表达式 - 如何确保用户不会输入 +-*+-*+-*+-*?
【发布时间】:2015-09-08 09:04:39
【问题描述】:

我想让用户只输入如下模式:

+9720545455454

056565656345

03-43434344

0546-4234234

*9090

+97203-0656534

意思是,我不想让用户胡言乱语,比如:

+954-4343+3232*4343+-

+-4343-+5454+9323+234

如何解决这个问题

public static bool IsPhoneNumberCorrect(string phoneNumber)
{
    return Regex.IsMatch(phoneNumber, @"^[0-9*+-]+$");
}

为了那个目的?

【问题讨论】:

  • 您允许在电话号码中使用+ 符号还是仅在开头?
  • @ZoharPeled:只在开头。
  • 有什么理由不使用GitHub: libphonenumber 之类的东西?
  • 之类的模式”不是规范。您需要更具体地了解此处的有效性。这意味着明确列出规则,而不是让我们试图从几个样本中找出它们。

标签: c# .net regex visual-studio


【解决方案1】:

如果你不关心数字组的长度,你可以只在开头允许+*,然后匹配初始数字,然后是可选的连字符+数字组:

return Regex.IsMatch(phoneNumber, @"^[+*]?\d+(?:-\d+)*$");

demo

请注意,您可以使用量词限制连字符+数字的数量。说,可以没有或1:

^[+*]?\d+(?:-\d+)?$"
                 ^

another demo

如果可能超过 1 个,请使用限制量词:

^[+*]?\d+(?:-\d+){0,3}$"
                 ^^^^^

这里,{0,3} 表示连字符+数字组的 0、1、2 或 3 次重复。

【讨论】:

    【解决方案2】:
    ^(?!(.*\+){2})(?!(.*-){2})(?!(.*\*){2})[0-9*+-]+$
    

    您可以使用lookaheads 来确保special characters 只出现once。查看演示。

    https://regex101.com/r/vV1wW6/1

    【讨论】:

      【解决方案3】:

      您首先需要做的是确定模式的确切含义。这不需要在代码中。在您的示例中,我看到一个前导字符,后跟第一个数字组,然后是可选的破折号和第二个数字组。前导字符可以是 +、* 或 0。数字组是 1 到 9 之间的一位数字,后跟 0 到 9 之间的一位或多位数字。翻译每个元素会得到:

      领导者:[+*0]

      破折号:-

      数字组:[1-9][0-9]+

      把所有东西放在一起

      [\+\*0][1-9][0-9]+(-[1-9][0-9]+)?
      

      某些组可能有最小和最大长度,您仍然可以将 + 更改为 {min, max}。

      【讨论】:

        猜你喜欢
        • 2016-01-12
        • 2017-09-23
        • 2014-02-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多