【问题标题】:Disadvantages of using Regular Expressions使用正则表达式的缺点
【发布时间】:2011-06-28 11:02:56
【问题描述】:

最近,我的经理建议我不要过多依赖 Regex,因为它有很多缺点。当我尝试了解更多信息时,我听说它存在诸如正则表达式可能导致内存泄漏的问题,因为某些对象即使在使用后仍会继续挂在字符串引用上?

.NET RegEx "Memory Leak" investigation

所以说 reg-ex 会导致内存开销并且如果您有其他选择不应该使用它是正确的吗? reg-ex 是否还有其他不利条件(除了难以学习:))

P.S 我正在开发一个类似于网络爬虫的应用程序 (c#.net),它提取所有 href 和一些其他信息,如标题、元标记等。我可以选择使用 HTML 敏捷包而不是 reg-ex。

【问题讨论】:

  • 1.不,不使用正则表达式的主要原因不是可能的内存泄漏。 2.You can't parse HTML with regex。 3. 使用 HTML 敏捷包。
  • 使用正则表达式提取hrefs?什么...解析html? oh dear
  • 顺便说一句,在 几次 情况下,当我们与服务器的 CPU 挂钩时,罪魁祸首是正则表达式遇到了极端情况……要非常小心和他们一起;p
  • @Marc 谢谢..会是:).. 根据 MSDN ,模式 = "href\\s*=\\s*(?:\"(?[^\" ]*)\"|(?\\S+))" 会为 href 解决问题。但我选择了 HTML Agility 包,因为我需要一些其他数据,这些数据可以在 xpath 和 DOM 的帮助下轻松有效地获取

标签: c# .net regex memory-leaks


【解决方案1】:

使代码难以阅读。大多数时候,即使以编写更冗长的代码为代价,最好还是不要使用正则表达式。代价高昂的性能影响和代码可读性的下降意味着您在大多数情况下不使用正则表达式,尤其是简单的和复杂的。

出于您提到的目的(解析 HTML 等),简单的正则表达式无法完成工作(因为 HTML 不是常规语言)。就像有一把锤子,一切看起来都像钉子。

【讨论】:

  • 你最后一句话很奇怪。锤子和钉子是完美的搭配。
  • @Daniel Hilgarth 我想我用对了——en.wiktionary.org/wiki/…
  • @Daniel:有趣的是,我在我的文章中使用了相同的表达方式,但措辞(我认为)要好一些。这个想法是,当你有一把锤子时,一切看起来都像钉子。例如那个螺丝?用锤子敲吧!
  • @manojlds: 啊,这就是你的意思......不过,你应该在链接中这样说
  • @manojlds:因为害怕偏离主题而变成英语用法,我认为差异是微妙的。 “所有你看到的都是指甲”意味着它们实际上是指甲,没有别的。 “一切看起来都像钉子”意味着事物看起来只是钉子,而实际上它们可能不是。
【解决方案2】:

我对此的看法是 RegEx 通常可以完成这项工作,但您需要注意不要过度使用它们。正如他们所说,当你只有一把锤子时,每个问题看起来都像钉子。

在这种情况下,您尝试解析 HTML 以获取数据。 HTML 解析器将更具可读性并且可能更可靠。解析 HTML 的正则表达式在某些情况下要么会失败(格式错误的 HTML 是大问题),要么会比使用 HTML 解析器复杂得多。

我不知道内存泄漏和性能问题,但我什至忽略了我倾向于尽量减少正则表达式的使用。

【讨论】:

    【解决方案3】:

    正则表达式可以混淆你正在使用的逻辑;有时在代码中执行此操作可能不那么复杂。在代码中,您可以分解不同的逻辑测试并对每个测试进行注释,以便人们可以看到您为什么要这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-29
      • 1970-01-01
      • 1970-01-01
      • 2020-09-14
      相关资源
      最近更新 更多