2009-12-11 814 views
7

我有幾個正則表達式(實際上有幾千個正則表達式),我必須檢查一個字符串是否與這些正則表達式匹配。它效率不高,所以我想將所有這些正則表達式合併爲一個正則表達式。將幾個正則表達式合併爲一個正則表達式

例如,如果有這些正則表達式:

  • '富*欄'
  • '富*拉鍊'
  • '扎普*欄'

我想獲得'foo *(bar | zip)| zap * bar'之類的東西。

是否有一些算法,庫或工具來做到這一點?

回答

7

您可以使用或連接正則表達式((|)(以及錨定字符串的開始/結尾)。

大多數良好的正則表達式庫在從正則表達式構建它們之後優化它們的有限狀態自動機。例如,PCRE就是這樣做的。

這一步通常會照顧你的優化問題,即。他們應用了大部分必須「手工」完成的轉換。

+0

良好的第一步,但您不必手動優化:http://www.rexegg.com/regex-optimizations.html – 2016-11-23 21:52:35

0

即使可能,我也無法想象得到的正則表達式會更高效。

+2

我不同意;對於「foo(?:bar | baz)」的正則表達式搜索將比搜索「foo bar」和搜索「foo baz」更快,因爲單獨搜索需要匹配(或不)「foo」部分兩次。 – 2009-12-11 15:30:45

+1

-1構建自動機的方式會自動優化許多情況。最重要的是,你可以進一步優化結果狀態機(參見Vlad的答案)。 – 2009-12-11 15:30:51

+0

me〜=校正。謝謝! – hometoast 2009-12-11 15:34:40

0

我非常懷疑它,理由是任何這樣的工具必須非常複雜才能處理正則表達式可以結合的所有不同方式。

如果你的正則表達式比較簡單,比如在你的例子中,但是你可能有一些運氣寫自己的東西。

2

理論上,正則表達式是一個(非確定型)有限狀態自動機;因此可以合併並最小化。你可以看看this作爲一個起點。

但要小心,這可能不是最正確的答案。爲什麼你必須處理數千個正則表達式?我只能揣測這種事情的重要性。也許你應該考慮編寫一個解析器和一個語法 - 很容易完成(而語法無論如何都比regexps更強大)。

+0

一些正則表達式引擎包含在DFA中不可實現的功能,例如任意嵌套括號匹配。在採用這種方法之前,請確保您的起始正則表達式實際上可以轉換爲DFA,以便您可以將它們與NFA結合起來,然後將其轉換回DFA並最小化。 – Techrocket9 2016-12-18 20:45:08

相關問題