0

我正在尝试创建一个可以将 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 )}/;

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

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

感谢
史蒂夫

4

2 回答 2

4

由于正则表达式可以通过递归应用有限数量的元素来正式定义,因此可以这样做:不是简单地连接元素,而是根据正则表达式的规则组合它们。因为正则语言也是递归可枚举的,所以保证可以工作。

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

于 2009-05-27T13:22:45.003 回答
1

我会说这//是最简单的正则表达式(它匹配任何东西)。 /./相当复杂,因为它只是 的简写/[^\n]/,它本身只是更长表达式的简写(该表达式的内容取决于您的字符集)。下一个最简单的表达式是字符集中的第一个字符在/a/哪里。a最后一条语句为您的枚举带来了一个有趣的问题:您将使用什么字符集?任何枚举都将绑定到给定的字符集。假设您从//0 开始, /\x{00}/(匹配 nul 字符)为 1,/\x{01}/如 2 等。然后,如果您使用 ASCII 集,您将开始在 129 左右进入有趣的正则表达式(匹配多个字符串的正则表达式),但对于 UNICODE 5.0,它最多需要 1114112。

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

于 2009-05-28T03:50:08.447 回答