解析更好:正则表达式还是linq?

时间:2011-10-10 19:46:20

标签: c# regex performance windows-phone-7 html-agility-pack

我正在将网页解析为Windows Phone 7,我需要知道更好的方法是什么。最重要的是性能。我在example with imdb that the author uses regex看到了,但我不确定如果我使用Html Agility Pack和Linq它会不会更好。

P.s。:我必须解析网站,而不是我的网站。

2 个答案:

答案 0 :(得分:7)

使用Html Agility Pack和Linq将获得最佳效果。

Parsing HTML with RegEx is quite unreliable.

答案 1 :(得分:0)

我偶然在研究类似的主题。我没有告诉你任何权威声明,因为它太早了。首先,我使用了3个引擎:

当然,还有很多选择(即使我曾经为Palm OS编写了一个简单的html查看器),但这似乎是一个好的开始。

Majestic没有提供Html->文本转换,只是一个示例代码如何遍历html字符串。首先,我实现了简单的转换:

  • 编写所有文本节点
  • 转换< p>到“\ n \ n”和< br>到“/ n”
  • 忽略其他一切

然后我收集了50多个html文件的样本,并使用所有3种方法进行转换。我不得不说我对这两种方法都不满意。两个一般性意见:

  • Majestic和Agility的结果非常相似
  • 正则表达式方法慢了一个数量级。

所以我查看了Regex代码并在底部找到了一个无意义的循环。经过简单的优化后,Regex方法只慢了约25%。鉴于它有超过30个复杂的正则表达式替换,我认为这是一个很好的结果。

然后我写了一个测试html文件,其中包含所有常见的html标签以及更多内容。和以前一样,Majestic和Agility表现相似。

  • 所有引擎都可以:h1,p,标记为文本
  • 所有引擎都失败了:h2 +,hr,b
  • br:正则表达式失败,Majestic ok
  • 列表:Regex ok,Majestic失败
  • 简单的2x2表:正则表达式确定,Majestic失败

还有很多要测试的东西。例如编码。

此刻我只会说Regex似乎是一个更好的选择。但是,所提到的发动机都没有令人满意地发挥作用。从积极的方面来说,调整这些引擎(特别是Majestic和Regex)很容易。也许同样适用于Agility也是如此,但是,我并没有深入研究这个包装。