【问题标题】:Regex Capturing groups from HTML string in .NET正则表达式从.NET中的HTML字符串捕获组
【发布时间】:2015-08-20 16:46:35
【问题描述】:

希望从 html 中捕获 Header、Name 和 Val 等组

HTML 可能会有所不同,但通常是这样的

<div>
   <h5>Header 1</h5>
      <strong>Name1</strong>
          &nbsp;
          Value 1 <br>
      <strong>Name2</strong>
          &nbsp;
          Value 2 <br>
   <div>
   <h5>Header 2</h5>
      <strong>Name1</strong>
          &nbsp;
          Value 1 <br>
          Value 1 continued
      <strong>Name2</strong>
          &nbsp;
          Value 2 <br>
   <h5>Header 3</h5>
      <strong>Name1</strong>
          &nbsp;
          Value 1 <br>
          Value 1 continued
      <strong>Name2</strong>
          &nbsp;
          Value 2 <br>
   <br>
   </div>
</div>

这是我开始使用的,但这依赖于

string pattern = "((<h5>(?<Header>.*?)<\\/h5>)|(<strong>(?<Name>.*?)<\\/strong>)|(&nbsp;(?<Val>.*?)<br>))

【问题讨论】:

  • much better tools 可用于此工作,请勿使用正则表达式。
  • 我要强调这部分:HTML 可能会有所不同,但这就是它通常的样子。您对基于 HTML 解析器的解决方案感兴趣吗?我希望你应该这样做,因为有了解析器,你将能够安全地做两件事:提取文本并将实体转换为文字。
  • @LucasTrzesniewski CsQuery 看起来是一个很棒的工具。您能帮我如何选择上述组或包含更详细示例的链接吗?谢谢

标签: c# html .net regex grouping


【解决方案1】:

从输入中删除“br”标签的并发,瞧。 str.Replace("&lt;br&gt;","")

【讨论】:

    【解决方案2】:

    我把模式改成

    string pattern = "(((?<=<h5>)(?<Header>.*?)(?=<\\/h5>))|((?<=<strong>)(?<Name>.*?)(?=<\\/strong>))|((?<=<\\/strong>)(?<Val>.*?)((?=<h5>)|(?=<strong>)|(?=<\\/div>))))";
    

    似乎工作正常。如果你有更清晰更好的答案,我会将你的答案设为正确答案。

    【讨论】:

    • if you have a cleaner better answer 当然。使用 HtmlAgilityPack 而不是维护这个怪物字符串 :)
    • @Eser 请使用 HTMLAgilityPack 用代码编写答案。
    猜你喜欢
    • 2016-12-15
    • 1970-01-01
    • 2012-08-20
    • 2022-07-22
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多