2012-08-07 112 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