Regex.Match问题c#

时间:2014-12-03 01:04:10

标签: c# html regex

所以我正在使用c#win form程序,我需要它使用Regex.Match方法来显示页面上写的某些东西。

网站HTML

<pre id="code" class="brush: text; plain-text">1</pre>

我尝试了什么

if (WebBrowserReadyState.Complete == webBrowser1.ReadyState)
        {
            if (webBrowser1.DocumentText.Contains("brush: text; plain-text"))
            {
                Match match1 = Regex.Match("class=\"brush: text; plain-text\">(.*?)<", webBrowser1.DocumentText.Replace("\r", "").Replace("\n", ""));
                if (match1.Success)
                {
                    String pointsStr = match1.Result("$1").ToString();
                    label7.Text = pointsStr;
                }
            }
        }

链接到HTML PAGE:https://www.dropbox.com/s/6te2udjz14tutpt/Verison.txt?dl=0

基本上我需要它在Label7.Text中完全加载网页后显示1。

3 个答案:

答案 0 :(得分:0)

您可以为Regex组提供正确的名称,然后按名称引用它们。例如,我将元素内容命名为desired。然后使用Math.Groups[groupName].Value获取匹配的值,如:

Match match1 = Regex.Match("class=\"brush: text; plain-text\">(?<desired>.*?)<", webBrowser1.DocumentText.Replace("\r", "").Replace("\n", ""));
if (match1.Success)
{
    String pointsStr = match1.Groups["desired"].Value;
    label7.Text = pointsStr;
}

同样最好逃脱尖括号,并将你的模式放在一个@ quoted字符串中,虽然看起来上面工作正常:

@"class=\""brush: text; plain-text\""\>(?<desired>.*?)\<"

是的,正如您在评论中看到的那样,仅将Regex用于常规语言。 HTML不是常规语言,因此您最好使用其他适当的工具,例如HTML敏捷包。

答案 1 :(得分:0)

获取Dropbox文件内部文本的一种方法是将“www.dropbox.com”更改为“dl.dropboxusercontent.com”并下载。所以我做的是这个:

var wc = new WebClient {Proxy = null};
var url = "https://www.dropbox.com/s/6te2udjz14tutpt/Verison.txt?dl=0"
    .Replace("www.dropbox.com", "dl.dropboxusercontent.com");
Label7.Text = await wc.DownloadStringTaskAsync(url);

答案 2 :(得分:0)

实现这一目标的一种更简单的方法几乎可以肯定是用这样的直接元素访问替换正则表达式(未经测试):

if (WebBrowserReadyState.Complete == webBrowser1.ReadyState) {
  var elemCode = webBrowser1.Document.GetElementById("code");
  if (null != elemCode) {
    label7.Text = elemCode.InnerText;
  }
}

这可能更快,也更强大。