我想知道是否有任何關於何時使用正則表達式VS "string".contains("anotherString")
和/或其他String API調用的一般準則?正則表達式與絕對迭代的最佳實踐
雖然上面給出的.contains()
的決定是微不足道的(如果你可以在一次調用中做到這一點,爲什麼要打擾正則表達式),現實生活帶來了更復雜的選擇。例如,做兩個.contains()
調用還是一個正則表達式更好?
我的經驗法則是總是使用正則表達式,除非這可以用一個API調用來替代。這可以防止代碼反對膨脹,但從代碼可讀性的角度來看可能不是很好,特別是如果正則表達式趨於變大。
另一個經常被忽視的觀點是性能。我如何知道這個正則表達式需要多少迭代(如「大O」)?它會比純粹的迭代更快嗎?不知何故,每個人都假設一旦正則表達式比5 if
語句短,它肯定會更快。但是,情況總是如此嗎?如果正則表達式不能預先編譯,這尤其重要。
你的答案根本沒有意義。正則表達式這個|在字符串中進行一次線性搜索,當遇到「th」時只有一點額外的邏輯,停止在這個或那個的第一個匹配處。使兩個包含()調用對字符串進行兩次線性搜索,如果不包含第一個單詞,則需要搜索完整字符串。這總會有更糟糕的表現。 。*。*。* *絕對不會優化得更好,因爲最初的。*匹配整個字符串直到結束,然後回溯以找到單詞。 – 2010-02-25 02:09:19
最糟糕的情況是相同的,每個模式都會在每個相關的字符位置進行嘗試。對於少數直接比賽,我同意「this | that」具有更多最佳情況(例如,'that'發生在字符串中,但不是'this')。隨着模式列表的增長以及錯誤開始的可能性增加,它會發生變化。在這種情況下,我可能離開了基地。直接文字匹配可能總是有利於正則表達式(儘管Java的特定實現似乎對來自經驗的數百種模式進行了曠日持久的表現)。 – PSpeed 2010-02-25 03:33:46
對於非文字模式,匹配本身很昂貴,它可能會支付運行幾個單獨的操作,而不是一個大的正則表達式...尤其是如果你不關心最早的匹配(位置明智)。 – PSpeed 2010-02-25 03:34:37