2016-09-13 87 views
1

我在長約3000個字符的文本塊上運行多管道正則表達式。我有6個不同的比賽總是相對於彼此相同的順序和複雜這是我一直想現在是最後一個firsst在正則表達式中優化或管道(|)

Pattern1|Pattern2|Pattern3|Pattern4|Pattern5|Pattern6 

優先考慮我測試是發現樣式1文本塊。獨立需要41個步驟,在管道中需要30,000多個。我知道這可能需要更具體的信息來解決這個特定的問題,但是想知道是否有一些通用的步驟可以使管道和/或管道更有效率。有沒有一個「訂單」有幫助?顯然,這並不是測試第一種模式,然後退出,因爲它仍然是41步,所以想知道我是否需要堅持一些我不知道的基本和/或構造。

+2

我想公平的第一個問題是:爲什麼你使用這個正則表達式? – usr2564301

+0

是的,基本的是,模式是在每個分支(而不是整個分支的分支)在字符串中的每個位置(從左到右)進行測試。 –

+0

我不完全瞭解您的個人正則表達式是如何相關的,但是您可以將它們分解爲獨立搜索嗎?如果是這樣,那麼您可以使用多處理模塊來設置工作進程,每個進程只搜索其中一個術語。也許某些後期處理可能會將結果組織爲您需要的格式。我不知道任何方式來再次簡化給定的正則表達式。 – skrrgwasme

回答

0

關於優化輪換組的要點是備選分支不應該在相同位置匹配。

考慮到有許多相似的子那些在圖案上方字符串:

Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern Pattern2 

regex demoPattern1首先被嘗試,並且它匹配Pattern但由於它後面沒有數字,所以替代方法被丟棄並嘗試下一個分支。 Pattern2也上升到了數字,但沒有數字。等等。

如果你讓你的正則表達式從一個公共前綴開始,然後對不同的結尾使用一個組 - 如Pattern(?:1|2|3|4|5|6) - 那麼很多多餘的回溯就不會出現。