【问题标题】:RegExp Counting System正则表达式计数系统
【发布时间】:2010-10-29 06:36:48
【问题描述】:

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

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

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

感谢
史蒂夫

【问题讨论】:

    标签: ruby regex counting


    【解决方案1】:

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

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

    【讨论】:

    • 我如何“将它们与正则表达式的规则结合起来。”?正则表达式字典不适合我的目的,因为我需要无限范围的正则表达式。从最不复杂的形式开始,向无穷大变得越来越复杂。
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2022-12-08
      • 2017-12-30
      • 2023-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多