0

可能重复:
匹配美国电话号码的正则表达式

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

  1. 电话号码的示例站点 1
  2. 电话号码的示例站点 2

基本上我打算使用所有美国模式的电话号码,但我发现的任何东西我都使用了它,但没有运气我正在使用这个代码:

代码:公共静态字符串 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();
}

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

4

3 回答 3

0

您使用“@”符号忽略转义序列,然后使用\\转义反斜杠字符。

删除多余的反斜杠或 @ 符号,因为您的正则表达式看起来适合基本的美国电话号码。

请参见此处:用于标准 SO 答案的电话号码验证的综合正则表达式,如果您还没有看到,请参见此处: http ://regexlib.com/Search.aspx?k=US%20Phone%20number 一个好的正则表达式站点他们呢。

于 2012-11-10T05:02:41.383 回答
0
  • 您正在使用字符串文字,因此您'\\'不会转义反斜杠。只需删除多余的斜线即可让您匹配您的第一个案例
  • 要处理多个案例,您必须将这些多个案例放入正则表达式中。由于您可能有一个前导括号,因此您必须通过\(?. 与尾随的相同,您可能有 0+ 个空格或破折号,因此您需要检查 or 大小写,而不是仅仅 - 您需要(\)\s*|-)
  • 您不需要围绕\d{3}or\d{4}组的括号,因为它是一个匹配项。这可能只是让表达式更难阅读和理解

这样就为您的正则表达式初始化留下了以下内容

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

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

作为旁注,如果您不理解正则表达式,它们就是其中一种非常神秘的东西。如果您实际上不了解表达式中要检查的内容,则尝试仅使用其他人的表达式并使用它可能会产生不良结果。另外,我在那里写的也不全面。它只在这两种情况下有用。为了能够处理任何电话号码,表达式很快变得复杂得多。

于 2012-11-10T05:04:28.730 回答
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})"

于 2012-11-10T05:05:55.657 回答