0

我正在尝试解析 html 页面,并使用以下正则表达式:

var regex = new Regex(@"<tag1 id=.id1.>.*<tag2>", RegexOptions.Singleline);

“tag1 id =.id.1”在文档中只出现一次。“tag2”在“tag 1”出现后出现了近 50 次。但是当我尝试用我的正则表达式匹配页面代码时,它只返回 1 个匹配项。此外,当我将 RegexOptions 更改为“None”或“Multiline”时,不会返回任何匹配项。我对此感到非常困惑,并希望得到任何帮助。

4

2 回答 2

2

用 RegEx 解析 Html 是一个非常糟糕的主意,而且它不可靠,因为世界上仍然存在很多“损坏的 html”。要解析 HTML,我建议使用HTML Agility Pack。它是一个出色的 HTML 解析库,我从来没有遇到过我输入的任何 HTML 的问题。

于 2012-09-20T15:21:33.060 回答
2

撇开关于不使用正则表达式解析 HTML 的明显劝告不谈,我可以向您解释为什么您会看到您所看到的。

如果tag1您的文本中仅出现一次,则正则表达式只能匹配一次,因此永远不会有多个匹配项。正则表达式匹配“消耗”它们匹配的文本,因此下一次匹配尝试从最后一次成功匹配的末尾开始。

这导致了下一个问题:.*是贪心的,所以它匹配 (with RegexOptions.Singleline) 直到字符串的末尾,然后回溯到<tag2>它找到的最后一个,以便成功匹配。这是您只能获得一场比赛的另一个原因。

至于你的第二个问题:如果你不使用,为什么火柴会消失RegexOptions.Singleline?简单:如果没有该选项,点将无法匹配换行符,并且第.一个 和之间似乎至少有一个换行符。tag1tag2

于 2012-09-20T15:29:52.577 回答