【问题标题】:Validation for Phone Number to allow () and space, but regex I am using is not allowing to enter those.验证电话号码以允许 () 和空格,但我使用的正则表达式不允许输入这些。
【发布时间】:2011-11-08 11:51:20
【问题描述】:
  string Phno=txt_EditPhno.Text;
        bool check = false;
        Regex regexObj = new Regex(@"^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$");
        if ((String.IsNullOrEmpty(Phno))||(regexObj.IsMatch(Phno)))
        {}

我正在使用这个正则表达式允许电话号码允许,空格,-,()但它不允许上面提到的任何符号,是我使用的正则表达式错误还是我在做错误的方式

【问题讨论】:

  • 这似乎工作正常:gskinner.com/RegExr/?2v4uj 你能提供一个不匹配的示例输入吗?
  • 稍微偏离主题但相关,为了轻松自定义客户端验证屏蔽输入字段,请查看 AjaxControlToolkit MaskedEdit 扩展程序和验证。 asp.net/ajaxLibrary/AjaxControlToolkitSampleSite/MaskedEdit/…
  • 有什么问题?给定 444-333-2423 分机,它似乎可以进入 if 语句。 42425、444-424-2424 或 (444) 422-2424。 regexpal.com
  • 查看您的代码和表达式,似乎有效。似乎一个回答者和一个评论者已经测试了代码 - 我会发布更多围绕您上面发布的代码的代码,或者添加一些检查以确保您的数据实际上 i> 获取的是您认为 正在获取的数据(例如,输入文本框是否实际包含名称?还是空白?),因为问题似乎不在代码中你发布了。

标签: c# asp.net regex validation


【解决方案1】:

您列出的 RegEx 字符串工作正常:

System.Text.RegularExpressions.Regex regexObj = new System.Text.RegularExpressions.Regex(@"^(?:(?:\+?1\s*(?:[.-]\s*)?)?(?:\(\s*([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9])\s*\)|([2-9]1[02-9]|[2-9][02-8]1|[2-9][02-8][02-9]))\s*(?:[.-]\s*)?)?([2-9]1[02-9]|[2-9][02-9]1|[2-9][02-9]{2})\s*(?:[.-]\s*)?([0-9]{4})(?:\s*(?:#|x\.?|ext\.?|extension)\s*(\d+))?$");
regexObj.IsMatch("(555)-867-5309")
true
regexObj.IsMatch("+15558675309")
true
regexObj.IsMatch("+1.555.867.5309")
true
regexObj.IsMatch("+15558675309ext12345")
true
regexObj.IsMatch("+15558675309x12345")
true

您的代码中的错误必须在其他地方。您可以随时使用RegExLib.com 之类的工具来测试您的正则表达式。

【讨论】:

    【解决方案2】:

    使用稍微不同的方法也可能对您有用...在获取电话号码信息之前,我使用过一种方法,涉及提取所需信息并重新格式化它 - 您可能有不符合要求的要求适合这个解决方案,但我还是想建议它。

    使用这个匹配表达式:

    (?i)^\D*1?\D*([2-9])\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)\D*(\d)[^x]*?\s*(?:(?:e?(x)(?:\.|t\.?|tension)?)\D*(\d+))?.*$
    

    这个替换表达式:

    ($1$2$3) $4$5$6-$7$8$9$10 $12$13
    

    您应该能够按照指示重新格式化这些输入:

    Input                         Output
    ----------------------------- --------------------------------
    "1323-456-7890 540"           "(323) 456-7890 "
    "8648217634"                  "(864) 821-7634 "
    "453453453322"                "(453) 453-4533 "
    "@404-327-4532"               "(404) 327-4532 "
    "172830923423456"             "(728) 309-2342 "
    "17283092342x3456"            "(728) 309-2342 x3456"
    "jh345gjk26k65g3245"          "(345) 266-5324 "
    "jh3g24235h2g3j5h3x245324"    "(324) 235-2353 x245324"
    "12345678925x14"              "(234) 567-8925 x14"
    "+1 (322)485-9321"            "(322) 485-9321 "
    "804.555.1234"                "(804) 555-1234 "
    

    我承认这不是最有效的表达方式,但是当在少量文本上运行时,效率低下的正则表达式通常不是问题,尤其是在使用知识和少量文本编写时关心

    稍微分解一下解析表达式:

    (?i)^\D*1?\D*                      # mode=ignore case; optional "1" in the beginning
    ([2-9])\D*(\d)\D*(\d)\D*           # three digits* with anything in between
    (\d)\D*(\d)\D*(\d)\D*              # three more digits with anything in between
    (\d)\D*(\d)\D*(\d)\D*(\d)[^x]*?    # four more digits with anything in between
    \s*                                # optional whitespace
    (?:(?:e?(x)(?:\.|t\.?|tension)?)   # extension indicator (see below)
    \D*(\d+))?                         # optional anything before a series of digits
    .*$                                # and anything else to the end of the string"
    

    三位数字不能以0或1开头。扩展指示符可以是xexxtext(都可以有句号结尾)、extension、或xtension(结尾不能有句点)。

    正如所写,扩展名(即数字)必须是一系列连续的数字(但它们通常是,正如您给定的表达式所假设的那样)

    想法是使用正则表达式引擎提取前10位数字(不包括“0”和“1”,因为美国国内电话号码不以这些开头(除了作为开关,不需要或总是需要,并且不依赖于目标电话,而是您正在输入的电话。然后它将尝试拉出任何直到“x”的内容,并捕获“x”以及第一个连续的字符串之后的数字。

    它在输入格式方面允许相当大的容差,同时去除有害数据或元字符,然后生成格式一致的电话号码(这在许多层面上经常受到赞赏)

    【讨论】:

      猜你喜欢
      • 2015-03-29
      • 2011-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      相关资源
      最近更新 更多