【问题标题】:C# RegEx on a StreamReader will not return matchesStreamReader 上的 C# RegEx 不会返回匹配项
【发布时间】:2010-08-08 09:25:22
【问题描述】:

我正在为自己编写一个简单的屏幕抓取应用程序来使用 HTMLAgilityPack 库,在让它在几种不同类型的 HtmlNodes 上工作之后,我想我会喜欢并为电子邮件地址添加一个正则表达式出色地。唯一的问题是应用程序从未找到任何匹配项,或者可能找到但没有正确返回。即使在已知包含电子邮件地址的网站上也会发生这种情况。谁能发现我在这里做错了什么?

      string url = String.Format("http://{0}", mainForm.Target);
      string reg = "\b[A-Z0-9._%+-]+@[A-Z0-9.-]+.[A-Z]{2,4}\b";
      try
            {
                WebClient wClient = new WebClient();
                Stream data = wClient.OpenRead(url);
                StreamReader read = new StreamReader(data);
                MatchCollection matches = Regex.Matches(read.ReadToEnd(), reg, RegexOptions.IgnoreCase|RegexOptions.Multiline);
                foreach (Match match in matches)
                {
                    textBox1.AppendText(match.ToString() + Environment.NewLine);
                }

【问题讨论】:

    标签: c# regex screen-scraping


    【解决方案1】:

    使用原始字符串:

    string reg = @"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b";
    

    否则,\b 将成为退格键。此外,您的最后一个句点应该是\.,所以它只匹配文字句点。

    【讨论】:

    • 甜,它现在显示匹配:) 我将如何确保它不显示重复项?
    • @Stev,您的意思是如果同一封电子邮件在文本中出现多次?您可以将每个匹配项添加到 HashSet,然后仅在 Add 返回 true 时附加它(它不存在)。
    【解决方案2】:

    检查 read.ReadToEnd() 返回的字符串,看看您是否可以使用您的正则表达式在此字符串中找到电子邮件地址。我猜你的问题与 StreamReader 没有任何关系。

    【讨论】:

      猜你喜欢
      • 2020-01-28
      • 2020-06-04
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2018-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      相关资源
      最近更新 更多