2012-08-13 151 views
1

我寫了一個Java程序,可以生成一系列符號,如"abcdbcdefbcdbcdefg"。我需要的是Regex優化器,它可能導致"a((bcd){2}ef){2}g"有沒有用Java編寫的Regex優化器?

由於輸入可能包含unicodes,如"a\u0063\u0063\bbd",我更喜歡Java版本。

我想得到一個「短」表達式的原因是爲了節省空間/內存。這裏的符號序列可能會很長。

一般來說,要找到「最短」的優化正則表達式很難。所以,在這裏,我不需要那些保證「最短」標準的人。

+2

你基本上是想壓縮你的輸入字符串,並輸出看起來像正則表達式的格式? – Blender 2012-08-13 02:05:03

+0

請定義'正則表達式優化器'。 – EJP 2012-08-13 02:05:33

+3

從你的例子猜測你的需求,我建議快速的'return'。*「;' – bdares 2012-08-13 02:06:04

回答

5

我有一個討厭的感覺,創建匹配給定輸入字符串或字符串集合的最短正則表達式的問題將在計算上是「困難的」。 (與計算Kolmogorov複雜性的問題相似...)

值得注意的是,在匹配速度方面abcdbcdefbcdbcdefg的最佳正則表達式很可能是abcdbcdefbcdbcdefg。添加重複組可能會使正則表達式字符串更短,但不會使正則表達式更快。事實上,除非正則表達式引擎展開重複組,否則它可能會變慢。

我需要這個的原因是由於空間/內存的限制。

您是否有明確的證據證明您需要來做到這一點?

我懷疑你不會通過這樣做來節省一些有價值的空間......除非輸入的字符串真的很長。 (如果他們是長的,那麼你將使用普通的文本壓縮算法壓縮字符串得到更好的結果。)

+0

我完全同意你的看法。我需要這個的原因是由於空間/內存限制。 – JackWM 2012-08-13 02:17:28

+2

@JackWM:空間限制? – Eric 2012-08-13 02:18:16

+0

所有等價的正則表達式都應該編譯爲相同的NFA和DFA,但不可能說明這與他的實際需求有什麼關係。 – EJP 2012-08-13 03:12:27

2

正則表達式是不是壓縮

不要使用普通的替代品表達式來表示一個字符串常量。正則表達式旨在用於匹配多個字符串之一。這不是你在做什麼。

+0

他正試圖代表一組字符串。正則表達式是一個很好的方法。 – Gene 2012-08-13 02:26:33

+1

@Gene:他的例子表明他試圖表示一個單一的字符串。 – Eric 2012-08-13 02:28:07

+0

我相信一系列完全是常數的字符串。使用指針和字符串api可以讓你輕鬆地區別它。正則表達式中有太多的開銷,它在有限集上沒有用處! – sln 2012-08-13 02:42:08

0

我假設你正在試圖找到一個小的正則表達式來編碼一個有限的輸入字符串集合。如果是這樣,你還沒有選擇最好的主題行。

我不能給你一個現有的程序,但我可以告訴你如何寫一個方法。

沒有規範的最小正則表達式和determining the true minimum size regex is NP hard。當然你的集合是有限的,所以這可能是一個更簡單的問題。我得考慮一下。

但是一個良好的啓發式算法是:

  1. 構建一個微不足道的非確定性有限自動機(NFA)接受所有的字符串。
  2. 使用子集構造將NFA轉換爲確定性有限自動機(DFA)。
  3. 使用標準算法最小化DFA。
  4. 使用construction from the proof of Kleene's theorem得到一個正則表達式。

請注意,步驟3 確實爲提供了唯一的最小DFA。這可能是編碼字符串集合的最佳方式。

+0

如果在所有可變重複中,唯一的方法是給定正則表達式的構造的人類解釋。我認爲這是在大約100%的時間,否則不需要正則表達式。 – sln 2012-08-13 02:33:16

+0

您的解決方案是一個選項。問題在於字符串非常長。我不想將所有字符串直接存儲到文件中。 – JackWM 2012-08-13 03:08:04