我正在尝试创建一个系统,我可以将RegEx值转换为整数,反之亦然。其中零是最基本的正则表达式(可能是"/./"
),任何后续数字都是更复杂的正则表达式
到目前为止,我最好的方法是将所有可能包含在正则表达式中的值放入数组中:
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 )}/;
这种方法的最大问题是可以轻松生成无效的RegExp 。
是否已经建立了算法来实现我正在尝试的目标?如果没有,有什么建议吗?
感谢名单
史蒂夫
答案 0 :(得分:4)
由于可以通过递归地应用有限数量的元素来正式定义正则表达式,因此可以这样做:不是简单地连接元素,而是根据正则表达式的规则组合它们。因为常规语言也是recursively enumerable,所以这可以保证有效。
然而,实现这一点可能有点过头了。你需要这个什么? Number -> RegExp
键值对的简单字典是否更适合将正则表达式与唯一数字相关联?
答案 1 :(得分:1)
我会说//
是最简单的正则表达式(它匹配任何东西)。 /./
相当复杂,因为它只是/[^\n]/
的简写,它本身只是一个更长表达式的简写(表达式取决于你的字符集)。下一个最简单的表达式是/a/
,其中a
是字符集中的第一个字符。最后一个语句为您的枚举提出了一个有趣的问题:您将使用什么字符集?任何枚举都将绑定到给定的字符集。假设你从//
开始为0,/\x{00}/
(匹配nul字符)为1,/\x{01}/
为2,等等。然后你会开始进入有趣的正则表达式(匹配更多的正则表达式)如果你使用的是ASCII集,则大约为129,而不是一个字符串),但UNICODE 5.0最多需要1114112。
总而言之,我想说一个更好的解决方案是将数字视为一个字节序列,将这些字节映射到您正在使用的任何字符集,使用正则表达式编译器来确定该数字是否是有效的正则表达式,并丢弃数字无效。