正则表达式,在两个单词之间找到一个单词

时间:2010-03-05 22:24:38

标签: c# .net regex

我有这个字符串

<p/><ul><li>test1<p/></li><li>test2<p/></li></ul><p/>

我尝试做的是提取“li”标签内的所有“p”标签,但不提取其外部的“p”标签。

我只能到目前为止 通过

提取所有“li”标签
\<li\>(.*?)\</li\>

我迷失了如何在其中提取“p”标签。

非常感谢任何指针!

3 个答案:

答案 0 :(得分:5)

使用HTML解析器而不是正则表达式更加可靠。使用HTML Agility Pack

HtmlDocument doc = new HtmlDocument();
doc.LoadHtml("<p/><ul><li>test1<p/></li><li>test2<p/></li></ul><p/>");
IEnumerable<HtmlNode> result = doc.DocumentNode
                                  .Descendants("li")
                                  .SelectMany(x => x.Descendants("p"));

答案 1 :(得分:2)

<li>(.*?<p/?>.*?)</li>

将匹配<li>之间包含<p/>的所有内容。如果您只想匹配<p/>,那么:

(?<=<li>).*?(<p/?>).*?(?=</li>)

将第1组与<p/>标记匹配。

答案 2 :(得分:2)

试试这个,它使用了前瞻,因此LI不是选择的一部分。

(?<=<li>)(.*?<p/?>.*?)(?=</li>)

P.S。您还需要修复HTML,因为P标签的方式不对。正则表达式适用于以下HTML。

<ul><li><p>test1<p/></li><li><p>test2<p/></li></ul>