我知道把?:
放在正則表達式括號的開始位置會阻止它創建反向引用,這應該會更快。我的問題是,爲什麼要這樣做?速度增加是否足夠明顯以保證這一考慮?在什麼情況下會非常重要,因此每次不使用反向引用時都需要仔細跳過反向引用。另一個缺點是,它使得正則表達式更難以閱讀,編輯和更新(如果最終希望稍後使用反向引用)。爲什麼不創建反向引用?
因此,總之,爲什麼不打算反向引用?
我知道把?:
放在正則表達式括號的開始位置會阻止它創建反向引用,這應該會更快。我的問題是,爲什麼要這樣做?速度增加是否足夠明顯以保證這一考慮?在什麼情況下會非常重要,因此每次不使用反向引用時都需要仔細跳過反向引用。另一個缺點是,它使得正則表達式更難以閱讀,編輯和更新(如果最終希望稍後使用反向引用)。爲什麼不創建反向引用?
因此,總之,爲什麼不打算反向引用?
你是對的,性能是不是爲了避免捕獲組的唯一原因 - 事實上,它甚至不是最重要的原因。
另一個缺點是,它使正則表達式更難以閱讀,編輯和更新(如果您最終希望稍後使用反向引用)。
我看它周圍的其他方法:如果你習慣性地使用非捕獲組,它更容易保持在這些場合的組號的軌道時,你做選擇捕捉到的東西。本着同樣的精神,如果你使用的命名組(假設你的正則表達式的味道支持他們),你應該始終使用命名組,並始終指他們(在反向引用或替換字符串)的名稱,而不是數量。遵守這些規則一貫將至少部分抵消非捕獲組的可讀性懲罰。
是的,那就是不必弄亂你的正則表達式這樣一個PITA,誰寫/維持實現知道它的正則表達式的人。在。NET中,您可以設置ExplicitCapture
選項,從而將所有「裸露」括號視爲非捕獲組,並且僅捕獲指定組。在Perl 6中,括號(帶或不帶名稱)總是捕獲,方括號用於非捕獲組。其他口味最終可能會跟風,但同時我們只能依靠良好的習慣。
perl5語法的問題在於,要做你想做的事情很麻煩,對於簡單的未命名分組,使用很多'(?:⋯)'來使用'(?<ɴᴀᴍᴇ> ...) '\ k <ɴᴀᴍᴇ>'用於命名後退。儘管要好得多,但它們比'(⋯)','1'和'$ 1'多得多。 – tchrist 2011-04-28 01:24:55
我想你混淆反向引用像\1
和捕獲組(...)
。
反向引用通過使語言不規則來防止各種優化。
捕獲組進行正則表達式引擎做一些更多的工作來記住一組開始和結束,但不如反向引用的那樣糟糕。
http://www.regular-expressions.info/brackets.html解釋捕獲組和反向引用它們的細節。
編輯:
在反向引用使得正則表達式的非正規,考慮其匹配盧阿評論下面的正則表達式:
/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/
所以--[[...]]
是註釋,--[=[...]=]
是註釋,--[==[...]==]
是評論。 您可以通過在方括號之間添加額外的等號來嵌套註釋。
這不能與嚴格匹配regular language,所以一個簡單的有限狀態機不能在O(n)時間處理它 - 你需要一個計數器。
Perl 5正則表達式可以使用反向引用來處理這個問題。但只要您需要非常規模式匹配,您的正則表達式庫就必須放棄簡單的狀態機方法,並使用更復雜,效率更低的代碼。
不錯。 +1爲他無法正確詢問的問題提供正確的解決方案。 – 2011-03-14 02:12:09
這不是一個好答案,我也沒有把一個反向引用與一個捕獲組的建立混爲一談。這個答案根本不回答這個問題。我問爲什麼強制正則表達式來阻止創建反向引用(與捕獲組)。沒有混淆。至於答案,第二段有好的迴應,但你沒有提供解釋或例子。這意味着什麼使語言不正規?我不在乎捕獲組與反向引用的比較,我只是在談論跳過反向引用創建 – 2011-03-14 03:07:15
@tandu,我不知道「強制正則表達式阻止創建反向引用」。正則表達式包含捕獲組。通常只有捕獲組1到9可以在替換字符串中被引用爲'$ 1' ...'$ 9',所以這是沒有所有括號組捕獲組的原因之一。後向引用與捕獲組不同。反向引用是一個出現在正則表達式中的序列(相對於替換字符串),它引用了一個捕獲組,並且perl 5使用它們的'\ 1' ...'\ 9'語法。 – 2011-03-14 20:49:40
與編程中的任何事情一樣,在小編輯中加速永遠不值得擔心。如果你以兆字節的文本運行這個正則表達式,那麼差異會很大。 – 2011-03-14 01:59:39
@Travis,一些執行不當的正則表達式引擎會做指數回溯,即使是小輸入也會很慢。我遇到了這個問題,將一些Perl移植到python。 Python已經解決了很多're'模塊的問題,但是,你用正則表達式角落案例看到的失敗模式可能是O(2 ** n)最差的情況。 – 2011-03-14 02:06:22
@Mike我聽說可怕的回溯實現,但你如何達到O(2^n)?其中n =? – 2011-03-14 02:10:38