2012-08-07 147 views
2

有誰知道如何找到某個正則表達式模式的所有可能的匹配數?我的意思是這樣的:Ruby模式匹配 - 查找所有可能的匹配數

Calculator_1 _([0-1])回報2個可能的結果,因爲它可以匹配兩個不同的輸入:

-Calculator_1_0 
-Calculator_1_1 

Calculator_1 _([0-2 ])返回3個可能的結果,因爲它可以匹配三個不同的輸入:

-Calculator_1_0 
-Calculator_1_1 
-Calculator_1_2 

Calculator_1 _返回無限,因爲它可以匹配無限輸入(*):

-Calculator_1_0 
-Calculator_1_1 
-Calculator_1_2 
-Calculator_1_3 
-Calculator_1_a 
... 

編輯:順便說一句,這只是一個例子。

+2

在一般情況下,結果將是無限的,所以我不認爲有一些可以應用的開箱即用功能。你想用這個做什麼?你能提供一些背景嗎? – davidrac 2012-08-07 19:06:23

+0

這是一個非常複雜的程序,但基本上我需要計算機能夠從一系列用戶生成的正則表達式模式中選擇最佳模式。爲了做到這一點,我需要知道哪些模式具有最少量的可能匹配以及哪些模式最精確。在上面的示例中,第一個和第二個模式都將匹配「Calculator_1_0」,但第一個模式更精確,因爲它具有最少的匹配。把它看作一個正則表達式工具。 – Walker 2012-08-07 19:16:00

+0

我認爲即使是非常瑣碎的例子的可能組合是如此複雜,你不能用一個簡單的算法來預測...... – phoet 2012-08-07 19:41:29

回答

0

任何Ruby庫(我知道)都沒有內置這樣的功能。要做到這一點正確,你將需要parse the regular expression into pieces,要能之間正確區分(例如):

/1+/ # Infinite possibilities 
/1\+/ # 1 possibility 
/1\\+/ # Infinite possibilities 
/[1+]/ # 1 possibility 

一旦做這將是一個相對「簡單」的工作,早出該有任何的正則表達式一個*+,或{n,}預選賽,將所有(相關)?{n,m}預選賽內a|b交替和(a?b){2,3}分組表達式精確計數,所有[…]字符類轉換成組數字,並擴大了(乘)的結果。

鑑於目前無法輕鬆正確地解析正則表達式,但是,這個概念在水中已經死亡。我也擔心,你的想法也是如此。現在可以找到解決問題的另一種方法。

例如,如何使用所有正則表達式的線程和scan的塊形式並行處理匹配,停止並中止最早完成的所有進一步掃描?

+0

那麼問題是,我運行一系列用戶生成的模式對用戶生成的字符串,我需要找到哪個模式「最匹配」它。我確實知道這是可能的,因爲任何基於邏輯的代碼(如正則表達式)都可以分解爲基礎數學,並且從那裏可以計算出所有可能的結果。但是,這並沒有使它更加複雜。 – Walker 2012-08-08 03:37:14