【问题标题】:Regex.Match Issues c#正则表达式匹配问题 c#
【发布时间】:2014-12-03 01:04:09
【问题描述】:

所以我正在使用 c# win 表单程序,我需要它使用 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 页面:https://www.dropbox.com/s/6te2udjz14tutpt/Verison.txt?dl=0

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

【问题讨论】:

  • 所有人都尊重,我之前做过这样的方法,但我不认为那个人是完全理智的。
  • 不要这样做。相反,请使用 HTML 敏捷包。
  • 请解释@SLaks
  • 您拥有的代码到底是什么失败了?即,你实际得到了什么输出,或者什么异常?

标签: c# html regex


【解决方案1】:

在 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);

【讨论】:

  • Got Error sayError 3 'await' 运算符只能在异步方法中使用。考虑使用“async”修饰符标记此方法并将其返回类型更改为“Task”。
  • 在您的方法中,只需添加“异步”修饰符。因此,如果您当前的方法看起来像这样 public void GetVersion() 将其更改为 public async void GetVersion()
  • 另外,由于下载太小,您可以删除 await 关键字并将“DownloadStringTaskAsync”更改为“DownloadString”@Programerszz
【解决方案2】:

您可以给正则表达式组适当的名称,然后按名称引用它们。例如我将元素内容命名为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;
}

转义尖括号也是一个好主意,并将您的模式放在 @ 带引号的字符串中,尽管上面似乎工作正常:

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

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

【讨论】:

    【解决方案3】:

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

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

    这可能更快,也更健壮。

    【讨论】:

    • 实际上它起作用了,但它没有为 label7.text 显示任何内容,它改变了文本,但它没有改变它。
    • 检查您何时运行此代码;最初我的测试出于某种原因尝试使用 Navigated 事件,但 DocumentCompleted 工作得更好。 (您可能也不再需要 ReadyState 测试了。)
    猜你喜欢
    • 1970-01-01
    • 2011-07-17
    • 2017-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多