2009-05-27 44 views
0

我试图创建一个系统,在那里我可以正则表达式的值转换为整数,反之亦然。其中零是最基本的正则表达式(可能"/./"),和任何后续的数字会更复杂的正则表达式的RegExp的计数系统

我的最好的办法,到目前为止是坚持一切可以包含一个正则表达式中到一个数组的可能值:

values = [ "!", ".", "\/", "[", "]", "(", ")", "a", "b", "-", "0", "9", .... ] 

,然后从该阵列采取如下:

def get(integer) 
    if(integer.zero?) 
    return ''; 
    end 

    integer = integer - 1; 

    if(integer < values.length) 
    return values[integer] 
    end 

    get((integer/values.length).floor) + get(integer % values.length); 
end 

sample_regex = /#{get(100)}/; 

这种方法的最大的问题是一个无效正则表达式可以很容易地生成。

有一个已建立的算法来实现我想要?如果没有,有什么建议?

感谢名单
史蒂夫

回答

1

我要说的是//是最简单的正则表达式(它匹配任何东西)。 /./相当复杂,因为它只是/[^\n]/的简写,它本身只是一个更长表达式的简写(表达式取决于您的字符集)。下一个最简单的表达式将是/a/,其中a是您的字符集中的第一个字符。最后一条语句为您的枚举提出了一个有趣的问题:您将使用哪种字符集?任何枚举都会绑定到给定的字符集。假设你开始//为0,/\x{00}/(匹配空字符)为1,/\x{01}/为2,等等,那么你将开始进入有趣的正则表达式(匹配多个字符串的)129左右,如果你使用的ASCII字符集,但UNICODE 5.0需要1114112。总而言之,我会说一个更好的解决方案是将数字视为字节序列,将这些字节映射到您正在使用的任何字符集中,使用正则表达式编译器确定该数字是否为有效的正则表达式,以及丢弃无效的号码。

4

由于正则表达式可以通过递归地施加元素的有限数量的正式定义,这是可以做到的:不是简单地拼接元素,按照正则表达式规则将它们结合起来。由于常规语言也是recursively enumerable,这是保证工作。

但是,它很可能是矫枉过正来实现这一点。你需要做什么? Number -> RegExp键值对的简单字典不适合将正则表达式与唯一数字关联吗?

+0

我该如何“将它们与正规表达规则结合起来?”? 正则表达式字典不符合我的目的,因为我需要无限范围的正则表达式。从最简单的形式开始,向无穷大发展越来越复杂。 – Stefan 2009-05-27 18:36:08