【问题标题】:Which is faster, XPath or Regexp?XPath 或 Regexp 哪个更快?
【发布时间】:2010-08-04 13:50:52
【问题描述】:

我正在为 firefox 制作一个插件,它使用 ajax 加载一个 html 页面(插件有它的 XUL 面板)。

现在,我没有寻找一种方法来创建 document 对象并将 ajax 请求内容放入其中,然后使用 xPath 查找我需要的内容。
相反,我正在加载内容并将其解析为具有正则表达式的文本。

但我有一个问题。哪个更好用,xPath 还是正则表达式?哪个执行速度更快?

HTML 页面将包含数百个包含相同文本的元素,而我基本上想要做的是计算那里有多少元素。

我希望我的插件尽快工作,但我不知道 regexp 或 xPath 背后的机制,所以我不知道哪个更有效。

希望我很清楚。谢谢

【问题讨论】:

  • 必填链接:Do not use regex
  • 两者本质上都不比另一个快 - 这完全取决于它们的实现。
  • 只是想知道,为什么有些人认为这“不是一个真正的问题”?对于典型的编程任务,询问哪种方法最好(或最快)在我看来就像在 SO (imo) 提出的一个真正的问题。
  • @Abel - 在询问性能时,您需要说明要求是什么 - 即,如果一个需要 100 毫秒和 101 毫秒,那么哪个更快并不重要

标签: javascript regex performance xpath firefox-addon


【解决方案1】:

当您处理 XML 时,请使用 XPath(或 XSLT、XQuery、SAX、DOM 或任何其他支持 XML 的方法来处理您的数据)。 Do never use regular expressions for this task

为什么? XML 处理错综复杂,要处理所有奇怪的东西、外部/已解析/未解析实体、DTD、处理指令、空白处理、折叠、unicode 规范化、CDATA 部分等,这使得创建可靠的正则表达式非常困难- 获取数据的方式。想想看,这个行业花了好几年的时间来学习如何最好地解析 XML,这应该是足够的理由不要自己尝试这样做

回答您的问题:在速度方面(这应该不是您在这里主要关心的问题),它高度依赖于 XPath 或 Regex 编译器/处理器的实现。有时,XPath 会更快(即,如果可能的话,使用键或编译的 XSLT),有时,正则表达式会更快(如果您可以使用预编译的正则表达式并且您的查询很容易)。但是正则表达式对于 HTML/XML 来说从来都不是一件容易的事,仅仅因为匹配嵌套括号(标签)问题,单独使用正则表达式无法可靠地解决这个问题。

如果输入量很大,正则表达式往往会更快,除非 XPath 实现可以进行流式处理(我相信这不是 Firefox 内部的方法)。

你写道:

"哪个更有效"*

让您以最快的速度获得相对快速的可靠且稳定的实施。使用 XPath。如果您需要在浏览器中运行代码,它也可以在 Firefox 和其他浏览器中使用。

【讨论】:

  • 感谢您的回复。现在我有另一个新手问题。您是否知道如何在 Firefox 附加组件的 XUL 中创建新的 HTML 或 XML 文档对象?由于 document.evaluate 仅适用于 XML 和 HTML 而不是 XUL。我需要以某种方式将 AJAX 响应文本放入 DOM 文档,以便能够在其上使用 xPath。我花了 40 分钟寻找这个,但仍然没有找到。我知道我可以将内容加载到一个新选项卡中并在那里访问它,但这不是我想要做的。谢谢。 (不确定我是否必须创建一个新问题而不是在这里发表评论)
  • @aleluja:你应该再次询问你的新问题。
  • 很好的答案,还需要补充一件事:事实上,最新的 xpath 技术优于正则表达式。
  • 我可能会误解这个问题,但如果他只想要一个/近似/数量的元素,所有这些元素都包含相同的文本,那么正则表达式就可以了。实际上,如果您知道它们具有完全相同的属性,那么纯字符串也应该没问题。
  • @Anonymous:即使在那个简化的场景中,我也不建议使用正则表达式。封闭元素与非封闭元素,在注释/cdata 部分中,匹配括号或引号相对难以使用正则表达式完成的简单事实:不,不,不,这是一个陷阱,不要陷入其中。即使它们具有“完全相同的属性”,您也永远不知道这些相同的属性是否以相同的顺序格式化、注释掉等。节省大量时间并使用简单但有效的适当工具(XPath 就是其中之一,只需要几分钟来“计算”一份文件)。
猜你喜欢
  • 2011-12-03
  • 2010-11-10
  • 2012-10-03
  • 2011-02-15
  • 2012-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多