2009-12-03 55 views
17

我在讀Douglas Crockfords Javascript: The Good Parts,我剛剛完成了正則表達式章節。在這一章中,他呼籲JavaScript的\b,積極先行(?=)和負前瞻(?!)「不是一個好部分」JavaScript:好的部分;爲什麼前瞻不好?

他解釋了\b是不好的原因(它使用\w的字邊界的發現,並\w失敗對於任何使用unicode字符的語言),這對我來說是一個很好的理由。

不幸的是,積極和消極的前瞻不好的原因被遺漏了,我不能拿出一個。 Mastering Regular Expressions向我展示了隨着前瞻而來的力量(當然也解釋了它帶來的問題),但我無法真正想到任何能夠使它成爲「不是很好的部分」的事情。

任何人都可以解釋爲什麼JavaScript(正向|負向)向前或(正向|負向)總體上應該被視爲「不好」?

看來我不是唯一有這個問題的人:onetwo

+1

當我讀到那句話的時候,我用它搜索了一下,並提出了這個問題。很奇怪 - 他所說的一切都非常有道理,而且他幾乎總是解釋他說事情「不好」的原因。 – Skilldrick 2010-05-21 13:59:55

+1

我同意@Skilldrick。克羅克福德一直很善於解釋他在本書中幾乎所有觀點的推理,但在這種情況下,他根本沒有解釋任何事情。我找到沒有解釋後也搜索了一下,最終在這裏結束。在我看來,只要你瞭解他們是如何工作的,以及如果使用不當,他們可能會對性能產生潛在的負面影響,正面/負面看起來就非常棒。 – Chev 2014-10-22 01:35:36

回答

10

也許這是因爲Internet Explorer的perpetually buggy implementation of lookaheads。對於編寫關於JavaScript的書的任何人,任何不適用於IE的功能都可能不存在。

+9

我不知道克羅克福德先生在寫這篇文章時是怎麼想的,但這似乎是在javascript中使用lookahead時要小心的最好理由。儘管如此,將這種語言歸咎於bug的實現感覺有點不公平。 – 2009-12-17 10:21:09

+6

請記住:JavaScript可以在web之外使用,就像node.js所證明的那樣! – 2011-11-07 20:48:05

+1

當然!請記住,Javascript:好的部分是在node.js出現之前編寫的,所以這仍然是最好的答案。 – 2014-02-01 21:47:06

2

他們對他來說太難了?

或者:前瞻和lookbehinds(後者在JavaScript中不受支持)大大增加了regex時間。但通常不會通過JavaScript中的大量數據來重新編排。所以他們很棒;當他們有用時使用它們。

+1

太難看似乎不太可能...性能可能是一個原因,但這更多的是解釋問題,而不是語言規範問題。 – 2009-12-03 23:00:26

+3

我並不是真的很認真「太難」了。但是解釋者問題似乎是理所當然的,應該避免說語言特徵。但是,我再次不同意克羅克福德的觀點,認爲有什麼問題值得避免。 Lookarounds是太棒了。 – 2009-12-03 23:14:58

+4

克羅克福德是一個聰明的人,我認爲他會比任何人都知道他爲什麼總結看起來很糟糕,所以我給他打了一封電子郵件。如果他回覆,我會在這裏發佈(如果他自己不這樣做的話)。 – 2009-12-03 23:28:18

3

我能想到的唯一原因可能是它們僅受大約一半流行的正則表達式引擎的支持,但如果將自己限制爲通用支持的語法,則有很多事情是您無法完成的。

順便說(正|負)(先行|回顧後)有時統稱爲「環視」,如在此頁,其比較的特徵的各種實施方式中的支持:

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

+3

我也在這個方向上思考,但是總體上缺乏支持並不能真正將其定義爲實際支持它的特定語言的不良部分。 – 2009-12-03 22:57:41