2011-09-26 58 views
6

經過一番研究,我發現無法使用正則表達式來分析遞歸結構(如HTML或XML)。是否有可能全面列出日常編碼場景,我應該避免使用正則表達式,因爲使用正則表達式執行該特定任務是不可能的?讓我們說,正在討論的正則表達式引擎不是PCRE。什麼時候我不應該使用正則表達式?

+1

我認爲你的問題太廣泛了。 「何時使用工具」還不夠遠。對於所有可能的情況,你無法真正期待確定的答案,對嗎?何時使用工具:何時理解它,何時簡化工作,何時使代碼更清晰而不是更復雜...何時使用正則表達式?當你需要將模式與字符串進行匹配時。不能做得比這更好。 – Kobi

+0

我同意'何時使用正則表達式'是一個廣泛的問題。但是我認爲了解常用場景是非常有用的,在這些場景中,您無法使用正則表達式來完成特定的任務。這將爲開發人員節省大量時間。 –

+0

另請參閱此問題,[使用正則表達式解析]示例(http://stackoverflow.com/a/15589159/287948)。 –

回答

26

不要使用正則表達式時:

  • 你試圖解析語言不是regular language,或
  • 時,有專門爲你正試圖解析數據隨時提供解析器。

使用正則表達式解析HTML和XML通常是一個壞主意,因爲它們不是常規語言,並且因爲庫已經存在可以爲您解析它。

作爲另一個例子,如果您需要檢查一個整數是否在0-255範圍內,則更容易理解您使用語言的庫函數將其解析爲整數,然後檢查其數值而不是嘗試編寫與此範圍匹配的正則表達式。

+1

EPIC答案。滿分。 –

+2

滿分就是一個! +1 –

+0

我明白,但我只想知道一些日常編碼場景,我應該遠離正則表達式。如解析HTML或XML。 –

2

我的經驗法則是,當沒有其他解決方案存在時,使用正則表達式。如果已經有解析器(例如XML,HTML),或者您只是在尋找字符串而不是模式,則不需要使用正則表達式。

總是問自己「我可以解決這個問題,而不使用正則表達式?」。這個問題的答案會告訴你是否應該使用正則表達式。

7

我會從我的博客文章,When to use and when not to use regular expressions抄襲自己...

公共網站不應該允許用戶搜索輸入正則表達式。爲網站的搜索引擎賦予公衆正則表達式的全部權力可能會造成破壞性影響。存在諸如regular expression denial of service(ReDoS)攻擊之類的事情,應該不惜一切代價避免這種攻擊。

HTML/XML解析不應該用正則表達式來完成。首先,正則表達式旨在解析中最簡單的regular language。現在,隨着正則表達式的.NET風格中的平衡組定義的出現,您可以冒險進入稍微複雜的領域,並在受控的情況下使用XML或HTML做一些事情。但是,沒有多少意義。有可用於XML和HTML的解析器,可以更輕鬆,更高效,更可靠地完成工作。在.NET中,可以使用舊的XmlDocument方式處理XML,或者使用Linq to XML處理XML。或者對於HTML,有HTML Agility Pack

結論

正則表達式有其用途。我仍然認爲,在很多情況下,他們可以爲程序員節省很多時間和精力。當然,給定無限的資源時,人們幾乎總是可以構建比等效的正則表達式更高效的程序解決方案。

你決定放棄正則表達式應該基於3件事:

1。)您的場景中的正則表達式如此緩慢以致它已成爲瓶頸?

2.)您的程序解決方案實際上是否比正則表達式更容易編寫&?

3.)是否有專門的解析器能更好地完成這項工作?

+0

謝謝,史蒂夫。你的博客文章清理了很多! –

相關問題