【问题标题】:Extracting values using regex使用正则表达式提取值
【发布时间】:2012-10-15 00:22:40
【问题描述】:

我想从这段文本(html 标记)中提取值“64,111”。

     <tr>
     <th id="abc-xyz">Page <span class="sub">avg</span></th>
    <td headers="abc-xyz">
    10th Aug, 2011  </td>
  <td headers="abc-xyz">64,111</td>
     </tr>

我目前正在使用这个正则表达式 -:

Match m2 = Regex.Match(text, @"\<td headers=""abc-xyz""\>(.*?)\</td\>", RegexOptions.IgnoreCase);

但是没有结果,请告诉我我做错了什么?

【问题讨论】:

    标签: c# regex full-text-search pattern-matching


    【解决方案1】:

    用\转义双引号

    Match m2 = Regex.Match(text, "(?<=<td\sheaders=\"abc-xyz\">).*(?=</td>)", 
                           RegexOptions.IgnoreCase);
    

    【讨论】:

    • 当我使用@符号时,我想没有必要转义引号符号。但它仍然没有帮助,请建议
    • (?&lt;=&lt;td\sheaders="abc-xyz"&gt;).*(?=&lt;/td&gt;)
    • 不,它没有。你在 () 中包含 (?=) 所以这不是必需的。我猜它(错误)应该很简单,我必须在我的代码中犯了一些愚蠢的错误,但我无法弄清楚我上面写的代码是什么,我一直在编辑它,它适用于所有其他标签。
    • 是的,我可以看到你是绝对正确的,我正在使用 Visual Studio 并在正则表达式字符串前面使用 @ 符号,但它不起作用,请你使用 @ 符号编写正则表达式如果你不介意的话。就像我的代码中写的那样。对不起,你表现得像个傻瓜。
    • Regex.Match(text, @"(?&lt;=&lt;td\sheaders=""abc-xyz""&gt;).*(?=&lt;/td&gt;)", RegexOptions.IgnoreCase);
    【解决方案2】:

    而不是“。”使用不包括停止字符的字符类。也就是说,你想要"&gt;([^&lt;]*)&lt;",而不是"&gt;(.*)&lt;"。

    我假设您知道这不能替代真正的解析,而正则表达式无法做到这一点,所以我不会宣扬这一点。在这个网站的某个地方已经有一个非常有趣的回应。

    【讨论】:

    • 我猜您的方向是正确的,先生,但仍然无法正常工作,我什至尝试过 ">([^([^
    • 我对 C# 不是很熟悉,但是您是否尝试过删除 @ 和转义引号?
    【解决方案3】:

    给猫剥皮的方法不止一种。
    解析 XML 不限于正则表达式,因此这里是使用 Linq to XML 的一种方法。

    string found = (from td in XElement.Parse(myxml).Elements("td")
                    where td.HasAttributes
                    let headers = td.Attribute("headers")
                    where headers != null && headers.Value == "abc-xyz" && !td.HasElements
                    select td.Value).FirstOrDefault();
    

    Linq to XML tutorial

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      相关资源
      最近更新 更多