【问题标题】:JavaScript: The Good Parts; why is lookahead not good?JavaScript:好的部分;为什么前瞻不好?
【发布时间】:2009-12-03 22:30:01
【问题描述】:

我正在阅读 Douglas Crockfords Javascript: The Good Parts,我刚刚完成了正则表达式章节。在本章中,他称 JavaScript 的 \b、正向前瞻 (?=) 和负向前瞻 (?!) “不是一个好部分”

他解释了\b 不好的原因(它使用\w 进行单词边界查找,而\w 对于任何使用Unicode 字符的语言都失败),这对我来说似乎是一个很好的理由。

不幸的是,正负前瞻不好的原因被遗漏了,我想不出一个。 Mastering Regular Expressions 向我展示了前瞻带来的力量(当然也解释了它带来的问题),但我真的想不出任何可以将其定性为“不好的部分”的东西。

谁能解释为什么 JavaScript (positive|negative) lookahead 或 (positive|negative) lookahead 一般应该被认为是“不好的”?

看来我不是唯一一个提出这个问题的人:onetwo

【问题讨论】:

  • 当我读到那句话时,我在谷歌上搜索了一下,然后想到了这个。很奇怪——他说的其他一切都非常有道理,而且他几乎总是解释说事情“不好”的原因。
  • 我同意@Skilldrick。克罗克福德非常擅长解释他在本书中提出的几乎每一个观点的推理,但在这种情况下,他根本没有解释任何事情。在找不到任何解释后,我也用谷歌搜索并最终来到这里。在我看来,只要您了解它们的工作原理以及如果使用不当可能对性能产生的潜在负面影响,正/负前瞻就很棒。

标签: javascript regex regex-lookarounds


【解决方案1】:

可能是因为 Internet Explorer 的perpetually buggy implementation of lookaheads。对于任何编写有关 JavaScript 的书的人来说,任何在 IE 中不起作用的功能都可能不存在。

【讨论】:

  • 我不知道 Crockford 先生在写这篇文章时在想什么,但这似乎是在 javascript 中小心前瞻的最佳理由。不过,将错误的实现归咎于语言有点不公平。
  • 记住:JavaScript 可以在 web 之外使用,正如 node.js 所证明的那样!
  • 当然!但请记住,Javascript:好的部分是在 node.js 出现之前编写的,所以这仍然是最佳答案。
【解决方案2】:

我能想到的唯一原因可能是它们仅被大约一半的流行正则表达式引擎支持,但如果您将自己限制在普遍支持的语法上,那么您将无法做很多事情。

顺便说一下,(positive|negative)(lookahead|lookbehind) 有时统称为“lookaround”,如在此页面中比较了各种实现之间对功能的支持:

http://www.regular-expressions.info/refflavors.html

【讨论】:

  • 我也在考虑这个方向,但缺乏支持并不能真正将其视为实际支持它的特定语言的不良部分。
【解决方案3】:

他们对他来说太难了?

或者:lookaheads 和 lookbehinds(JavaScript 不支持后者)大大增加了正则表达式的时间。但是通常不会通过 JavaScript 中的大量数据进行正则表达式。所以他们很棒;在有用的时候使用它们。

【讨论】:

  • 太难似乎不太可能......性能可能是一个原因,但这更像是一个可以解决的解释器问题,而不是语言规范问题。
  • 我对“太难”一点并不认真。但是解释器问题似乎是说应该避免语言特性的好理由。但是,再一次,我不同意 Crockford 的观点,即存在任何值得避免的问题。环顾四周非常棒。
  • Crockford 是个聪明人,我认为他比任何人都更清楚为什么他认为前瞻是不好的,所以我给他发了一封电子邮件。如果他回复,我会在这里发布(如果他自己不这样做)。
  • 我还没有回答吗?我试图联系先生。克罗克福德也是如此。
猜你喜欢
  • 2013-09-30
  • 2013-07-07
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-24
  • 1970-01-01
相关资源
最近更新 更多