匹配所有字符的正则表达式返回的匹配太少

时间:2012-09-20 15:14:13

标签: c# regex

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

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

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

2 个答案:

答案 0 :(得分:2)

使用RegEx解析Html是一个非常糟糕的想法,它不可靠,因为世界上仍然存在很多“破解的HTML”。要解析HTML,我建议使用HTML Agility Pack。它是一个很好的解析HTML的库,我从来没有遇到过任何HTML问题。

答案 1 :(得分:2)

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

如果tag1仅在您的文字中出现一次,则正则表达式只能匹配一次,因此永远不会有多个匹配。正则表达式匹配“消耗”他们匹配的文本,因此下一次匹配尝试将在上次成功匹配结束时开始。

这导致了下一个问题:.*是贪婪的,所以它匹配(用RegexOptions.Singleline)直到字符串的结尾,然后回溯到它按顺序找到的最后一个<tag2>允许成功匹配。这是你只获得一场比赛的另一个原因。

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