2015-11-26 73 views
2

如何區分正則表達式,如果分隔符位於字符串內,可以在字符串中多次匹配正則表達式,即: 那麼'Bang bang swing'(BBS)aota'Bing Bong Bin '(BBB)正則表達式,更好的方法

與正則表達式匹配:''。+'(\ S +)「 它將匹配'Bang ...(BBB)中的所有內容,而不是匹配'Bang bang swing'(BBS) Bing Bong Bin'(BBB)

我有一種使用正則表達式工作的方式:'[A-z0-9 - /?| q〜`!@#$%^ & *()_- = + ] +'(\ S +) 但這是過度的,老實說,我討厭它甚至能正常工作。 我對於正則表達式相當陌生,從Pythons開始實現它們顯然不是啓動它的最明智的方式。

+2

谷歌'正則表達式貪婪lazy'。 –

+2

你需要使它非貪心:''。+?'(\ S +)' – Delgan

+2

該死的,謝謝。我嚴重反對使用這個完整的表達。不知道這些東西被稱爲貪婪/懶惰點,所以這也是非常有用的。搜索讓我回到了堆棧,文章完全回答了這個問題。 –

回答

2

要從一個角色得到一個子到另一個角色,那裏既沒有可以出現在中間,你應該總是考慮使用negated character classes

[negated]字符類別匹配不在字符類別中的任何字符。 與點不同,否定字符類也匹配(不可見)換行符。如果您不希望否定的字符類匹配換行符,則需要在該類中包含換行符。 [^0-9\r\n]匹配任何不是數字或換行符的字符。

所以,你可以使用

'[^']*'\([^()]*\) 

regex demo

這裏,

  • '[^']*' - 匹配之後比'等,然後接着是0個或多個字符''
  • \( - 匹配的文字)(它必須被轉義)
  • [^()]* - 比()其他0個或更多字符匹配(他們沒有一個字符類內進行轉義)
  • \) - 相匹配的文字)(必須在字符類外部轉義)。

如果你以前可能(...)部分1個或多個單引號,你將需要一個展開懶匹配的正則表達式:

'[^']*(?:'(?!\([^()]*\))[^']*)*'\([^()]*\) 

regex demo

這裏,'[^']*(?:'(?!\([^()]*\))[^']*)*'與DOTALL標誌的'.*?'相同,但由於線性正則表達式的執行效率更高。見more about unrolling regex technique here

編輯:

當輸入字符串不復雜的和短,懶惰點匹配原來更有效。但是,當複雜性增加時,懶點匹配可能會導致問題。

+0

但是然後展開的序列需要比懶惰步驟多兩倍的步驟。我可以看到它會更有用的情況。它實際上更好,因爲可能存在一個撇號,儘管它不符合完整格式。永遠不知道某人的輸入可能看起來如何。 –

+1

這取決於輸入的字符串長度。對於短字符串,懶點匹配是可以的,當在中間添加200個以上的符號時,圖片將會不同。 –

+0

那麼代碼將很可能在處理句子,他們應該相對較短。如果我能在合理的結構點內找到一個,我會嘗試找到正則表達式突破的方式,然後我會改變它。再次感謝。 –

1

這個怎麼樣正則表達式

'.+?'\(\S+\) 
+0

是的,這個序列的工作。懶惰點也幫助我使剩餘的正則表達式更有效率。現在閱讀更多的文檔。 –

+1

一旦你開始遇到延遲子模式的問題,google會展開循環regex,並研究這種比懶惰匹配更有效的方法。 –

+1

@stribizhev感謝您的投入:)我渴望全部學習:) – ashishmohite

相關問題