需要正则表达式来查找特定模式的电话号码

时间:2012-11-10 04:43:37

标签: c# regex

  

可能重复:
  Regular expression to match US phone numbers

我需要在html中找到电话号码,我在这里和谷歌上看过很多例子,但不确定为什么我不能让任何人工作,它根本找不到号码。假设html是:

  1. example site 1 for phone number
  2. example site 2 for phone number
  3. 基本上我打算使用所有美国模式电话号码,但是我发现我使用它的任何东西但没有运气我使用此代码:

    CODE:     public static string Extractphone(string html)     {         StringBuilder sb = new StringBuilder();

        try
        {
            List<string> tmpemail = new List<string>();
            string data = html; 
            //instantiate with this pattern 
            Regex emailRegex = new Regex(@"(\\d{3})-(\\d{3})-(\\d{4})",
                RegexOptions.IgnoreCase);
            //find items that matches with our pattern
            MatchCollection emailMatches = emailRegex.Matches(data);
    
            foreach (Match emailMatch in emailMatches)
            {
                if (!tmpemail.Contains(emailMatch.Value.ToLower()))
                {
                    sb.AppendLine(emailMatch.Value.ToLower());
    
                    tmpemail.Add(emailMatch.Value.ToLower());
                }
              //  (541) 708-1364
            }
            //store to file
        }
        catch (Exception ex)
        {
        }
        return sb.ToString();
    }
    

    我已经从许多例子中多次改变了模式,但没有运气。

3 个答案:

答案 0 :(得分:0)

您忽略了带有'@'符号的转义序列,然后使用\\来转义反斜杠字符。

删除无关的反斜杠或@符号,因为你的正则表达式看起来正确的美国电话号码。

请参阅此处:A comprehensive regex for phone number validation获取标准SO答案,此处:http://regexlib.com/Search.aspx?k=US%20Phone%20number代表一个优秀的正则表达式网站,如果您还没有看到它们。

答案 1 :(得分:0)

  • 您正在使用字符串文字,因此您的'\\'无法转义反斜杠。只需删除额外的斜线即可让您匹配第一个案例
  • 要处理多个案例,您必须将这些多个案例放入正则表达式中。由于您可能有一个领先的父母,您必须通过\(?来检查它。与你可能有的那个和0+空格或破折号相同,所以你需要检查或案例而不仅仅是 - 你需要(\)\s*|-)
  • 您不需要\d{3}\d{4}组周围的parens,因为它只是一个匹配。这可能只是让表达更难阅读和理解

因此,为您的正则表达式初始化留下了以下内容

Regex emailRegex = new Regex(@"\(?\d{3}(\)\s*|-)\d{3}-\d{4}",
            RegexOptions.IgnoreCase);

我没有对此进行过强有力的测试,但我认为这很有效。

作为旁注,正则表达式是那些如果你不理解它们就会非常神秘的东西之一。如果你实际上没有理解表达式中正在检查的内容,那么试图仅仅采取其他人的表达并使用它可能会产生不良结果。我在那里写的也不全面。它只适用于这两种情况。为了能够处理任何电话号码,表达式会变得更加复杂。

答案 2 :(得分:0)

试试这个regex

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

解释

  

(?:subexpression) 的   定义一个非捕获组。

     

\d 的   匹配任何十进制数字。

     

| 的   匹配由竖线|字符分隔的任何一个元素。

和示例代码:

var results = Regex.Matches(strInput, @"(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}");

但请注意:

  

逐字字符串文字以@开头,并且也用双引号括起来。例如:

     

@"c:\Docs\Source\a.txt" // rather than "c:\\Docs\\Source\\a.txt"

     

     

@"(\\d{3})-(\\d{3})-(\\d{4})"
rather than
@"(\\\\d{3})-(\\\\d{3})-(\\\\d{4})"