Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 需要正则表达式查找特定模式的电话号码_C#_Regex - Fatal编程技术网

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

C# 需要正则表达式查找特定模式的电话号码,c#,regex,C#,Regex,可能重复: 我需要在html中查找电话号码,我在这里和google上看到了许多示例,但不确定为什么我无法找到任何一个,它根本找不到电话号码。假设html是: 基本上,我是在寻找所有美国模式的电话号码,但我发现我使用了它,但运气不佳,我使用了以下代码: 代码: 公共静态字符串提取电话(字符串html) { StringBuilder sb=新的StringBuilder() 试试看 { List tmpemail=新列表(); 字符串数据=html; //用这个模式实例化 Regex ema

可能重复:

我需要在html中查找电话号码,我在这里和google上看到了许多示例,但不确定为什么我无法找到任何一个,它根本找不到电话号码。假设html是:

  • 基本上,我是在寻找所有美国模式的电话号码,但我发现我使用了它,但运气不佳,我使用了以下代码:

    代码: 公共静态字符串提取电话(字符串html) { StringBuilder sb=新的StringBuilder()

    试试看
    {
    List tmpemail=新列表();
    字符串数据=html;
    //用这个模式实例化
    Regex emailRegex=newregex(@“(\\d{3})-(\\d{3})-(\\d{4})”,
    RegexOptions.IgnoreCase);
    //查找与我们的模式匹配的项目
    MatchCollection emailMatches=emailRegex.Matches(数据);
    foreach(在emailMatches中匹配emailMatch)
    {
    如果(!tmpemail.Contains(emailMatch.Value.ToLower()))
    {
    sb.AppendLine(emailMatch.Value.ToLower());
    tmpemail.Add(emailMatch.Value.ToLower());
    }
    //  (541) 708-1364
    }
    //存储到文件
    }
    捕获(例外情况除外)
    {
    }
    使某人返回字符串();
    }
    

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

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

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

    请参见此处:了解标准SO答案,以及此处:如果您还没有看到好的正则表达式站点,请参见此处。

    • 您使用的是字符串文字,因此您的
      '\\'
      不会转义反斜杠。只需删除多余的斜杠,就可以匹配第一个案例
    • 要处理多个案例,您必须将这些多个案例放入正则表达式中。由于您可能有一个前导父项,因此您必须通过使用
      \(?
      )来检查它。与尾随父项相同,您可能有0+空格或破折号,因此您需要检查or大小写,而不仅仅是-您需要
      (\)\s*|-)
    • 您不需要在
      \d{3}
      \d{4}
      组周围使用paren,因为它是单个匹配项。这可能只是使表达更难阅读和理解
    这就为正则表达式初始化留下了以下内容

    Regex emailRegex = new Regex(@"\(?\d{3}(\)\s*|-)\d{3}-\d{4}",
                RegexOptions.IgnoreCase);
    
    我还没有对此进行过严格的测试,但我认为这是可行的


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

    试试这个
    regex

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

    (?:子表达式)
    定义非捕获组

    \d
    匹配任何十进制数字

    |
    匹配由垂直条
    |
    字符分隔的任何一个元素

    和一个示例代码:

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

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

    @“c:\Docs\Source\a.txt”//而不是“c:\\Docs\\Source\\a.txt”

    @“(\\d{3})-(\\d{3})-(\\d{4})”
    而不是
    @“(\\\\d{3})-(\\\\d{3})-(\\\\d{4})”


    正如我所说,我确实使用了很多东西,包括它也不起作用,而且你也没有混淆电话和电子邮件
    regex
    s
    var results = Regex.Matches(strInput, @"(?:\(\d{3}\)\s*|\d{3}-)\d{3}-\d{4}");