【问题标题】:Regex for american phone numbers that will also pickup (123) space and 123 dot [duplicate]美国电话号码的正则表达式,也将拾取(123)空格和123点[重复]
【发布时间】:2011-02-09 21:55:49
【问题描述】:

可能重复:
A comprehensive regex for phone number validation

我有这个。

1?\s*-?\s*(\d{3}|\(\s*\d{3}\s*\))\s*-?\s*\d{3}\s*-?\s*\d{4}

它匹配了很多电话号码,但没有捕捉到这两个:

(123) 456-7890 或 123.456.7890

【问题讨论】:

  • 我的眼睛,它们在流血......(不要使用这种充满垃圾邮件的标题,你不是在尝试搜索引擎优化你的问题!它看起来就像垃圾邮件)
  • 你为什么不试着理解你在做什么呢? :)
  • @cyperpine 你真的在乎吗?有很多方法可以写一个电话号码,你不应该验证它。分机号码呢?或者像“(555) 555-5555 询问 Tim”这样的小便条?
  • 我正试图从文档中刮掉它们。不关心扩展,但如果我能让它们很棒。谢谢。
  • 只看一处regexlib.com

标签: .net regex pattern-matching match phone-number


【解决方案1】:

不久前,我在一个字符串中问了一个关于 a regex for a certain number of digits 的问题。答案给了我这个正则表达式(\D*\d){10}{n}

从那时起,我实际上已将其用于电话号码验证。我不在乎他们给我的电话号码是什么格式,只要它包含 10 位数字。如果您只关心获得区号 + 电话号码,那么这也可能对您有用。

【讨论】:

    【解决方案2】:

    这是原始正则表达式的简化版本,应该可以满足您的要求。

    1?[\s-(.]*?\d{3}[ -).]*?\d{3}[ -.]*?\d{4}
    

    【讨论】:

      【解决方案3】:

      几个怪物
      捕获组 1、2、3 保存电话号码的各个部分。这是一个简单的验证。
      再多一点,它就会像哥斯拉一样。

      不需要区号
      /^(?:\s*(?:1(?=(?:.*\d.*){10}$)\s*[.-]?\s*)?(?:\(?\s*(\d{3}|)\s*\)?\s*[.-]?))\s*(\d{3})\s*[.-]?\s*(\d{4})$/

      需要区号
      /^(?:\s*(?:1(?=(?:.*\d.*){10}$)\s*[.-]?\s*)?(?:\(?\s*(\d{3})\s*\)?\s*[.-]?))\s*(\d{3})\s*[.-]?\s*(\d{4})$/

      代码示例(在 Perl 中)

      use strict;
      use warnings;
      
      my $rxphone = qr/
      ^
        (?:                         # Area code group (optional)
           \s*
           (?:
                1 (?=(?:.*\d.*){10}$)     # "1" (optional), must be 10 digits after it
               \s* [.-]?\s*
           )?
           (?: 
              \(?\s* (\d{3}|) \s*\)?      # Capture 1, 3 digit area code (optional)
              \s* [.-]?                   # ---  (999 is ok, so is 999)
           )
        )                           # End area code group
        \s*
        (\d{3})                     # The rest of phone number
        \s*
        [.-]?
        \s*
        (\d{4})
      $
      /x;
      
      my %phonenumbs = (
       1 => '(123-456-7890',
       2 => '123.456-7890',
       3 => '456.7890',
       4 => '4567890',
       5 =>'(123) 456-7890',
       6 => '1 (123) 456-7890',
       7 => '11234567890',
       8 => ' (123) 4565-7890',
       9 => '1123.456-7890',
       w => '1-456-7890',
      );
      
      for my $key ( sort keys %phonenumbs)
      {
          if ($phonenumbs{$key} =~ /$rxphone/) {
             print "#$key =>  '$1' '$2' '$3'\n";
          } else {
             print "#$key => not a valid phone number: '$phonenumbs{$key}' \n";
          }
      }
      __END__
      

      输出
      #1 => '123' '456' '7890'
      #2 => '123' '456' '7890'
      #3 => '' '456' '7890'
      #4 => '' '456' '7890'
      #5 => '123' '456' '7890'
      #6 => '123' '456' '7890'
      #7 => '123' '456' '7890'
      @ 987654331@
      #9 => '123' '456' '7890'
      #w => not a valid phone number: '1-456-7890'

      【讨论】:

        猜你喜欢
        • 2020-05-02
        • 1970-01-01
        • 2018-05-18
        • 1970-01-01
        • 2012-04-04
        • 2018-01-23
        • 1970-01-01
        • 2012-01-11
        相关资源
        最近更新 更多