RegExp计数系统

时间:2009-05-27 13:18:11

标签: ruby regex counting

我正在尝试创建一个系统,我可以将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

是否已经建立了算法来实现我正在尝试的目标?如果没有,有什么建议吗?

感谢名单
史蒂夫

2 个答案:

答案 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。

总而言之,我想说一个更好的解决方案是将数字视为一个字节序列,将这些字节映射到您正在使用的任何字符集,使用正则表达式编译器来确定该数字是否是有效的正则表达式,并丢弃数字无效。

相关问题