2012-09-20 19 views
0

我试图解析HTML网页,我用下面的正则表达式:正则表达式匹配的所有字符返回太少比赛

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

“标记1 ID = .id.1”文件中只出现一次。发生“标签1”后,“标签2”发生将近50次。但是当我尝试使用正则表达式匹配页面代码时,它只返回1个匹配项。此外,当我将RegexOptions更改为“无”或“多行”时,不会返回任何匹配项。我对此很困惑,并会感谢任何帮助。

+2

[解析Html The Cthulhu Way](http://stackoverflow.com/a/1732454/540352):) – Laoujin

+0

@Laoujin我喜欢那篇文章:) – Rotem

+0

[RegEx match open tags but XHTML self-contained标签](http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags) –

回答

2

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

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

这引出了下一个问题:.*是贪婪的,所以它匹配(与RegexOptions.Singleline),直到字符串的结尾,然后回溯,直到最后<tag2>发现为了让一个成功的匹配。这是你只获得一场比赛的另一个原因。

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

2

用RegEx解析Html是一个非常糟糕的主意,它的不可靠性,因为世界上仍然存在很多“坏HTML”。要解析HTML,我会建议使用HTML Agility Pack。这是一个优秀的解析HTML库,我从来没有遇到过任何与它相关的HTML问题。

相关问题