通过给定的正则表达式生成字符串

时间:2014-03-07 13:25:54

标签: ruby regex

如何在ruby中使用给定的正则表达式生成字符串?

Class MyRegex
   def self.generate_string(reg)
    #return generated string.
   end
end

当我打电话

MyRegex.generate_string(/a*/) #it will return random string.

期待输出:

aaa
aa
aaaaa

等等

3 个答案:

答案 0 :(得分:4)

派对有点晚了,但我创造了一个强大的红宝石宝石,解决了原来的问题:

https://github.com/tom-lord/regexp-examples

/this|is|awesome/.examples #=> ['this', 'is', 'awesome']
/https?:\/\/(www\.)?github\.com/.examples #=> ['http://github.com', 'http://www.github.com', 'https://github.com', 'https://www.github.com']

答案 1 :(得分:1)

简短的回答是你不能,因为如果允许*+或在右边打开的重复,某些字符串可能是无限的。 {4,}

如果你想以任何方式这样做,那么你有两个策略,两个策略都从解析正则表达式开始,并构建一个表示它的状态机。

然后你可以通过它生成最大长度为'n'的随机运行。这将为您提供最长n的随机字符串。或者,您可以将状态机中所有状态的空转换添加到终端状态,然后只需执行随机游走直到达到终端状态。这将为您提供一个完全随机的字符串,正则表达式接受该字符串,其中长度具有任意长度,但较长的字符串不太可能。但请注意,虽然字符串大小增加,但是输出新字符的概率下降,但是字符串长度永远不会达到无限,但是这个方法永远不会结束,尽管非常小,但这种方法永远不会结束。新角色的概率为零。

这几乎就是@ neil-slater https://github.com/repeatedly/ruby-string-random

在评论中发布的代码

修改

OP询问是否可以生成给定正则表达式匹配的随机字符串。

正则表达式是常规语言的字符串表示形式。有限自动机是对给定常规语言进行编码的决策器,并且可以确定给定字符串是否是该常规语言的一部分。所以基本上正则表达式匹配的工作方式是将正则表达式编译为有限自动机,并使用它来查看它是否接受字符串。那是匹配的。

现在让我们来看看代。您可以使用相同的有限自动机来生成字符串,但是作为有限自动机,正如@sawa正确指出的那样,仅适用于有限字符串,那么您必须确保只生成有限字符串。这样做的一种方法是随机决定最大长度,然后在fintite自动机中进行最多该长度的随机游走。不这样做的一种方法是@sawa和我建​​议以某种可能性进行转换,或者简单地停止。由于这可能不会终止,因为任何非零概率的乘积只会接近零,但新的达到它。

答案 2 :(得分:0)

这个答案并不是要完全回答你的问题。它的目的有两个:(i)表明这不是不可能的,所以jbr的答案是完全错误的,并且(ii)建议你,尽管如此,它不是微不足道的,你必须通过以下方法计算完整的代码:自己。

由于完全回答你的问题可能不适合像这样的Q和A网站中单个答案的空间,我将展示一个代码,生成与固定正则表达式匹配的所有可能的字符串:

/a*/

代码是这样的:

class Regexp
  def self.generate_string
    rand > 0.5 ? "" : "a#{generate_string}"
  end
end

每次运行Regexp.generate_string时,都会生成与/a*/匹配的随机字符串。字符串将具有任意长度,字符串越长,生成的可能性就越小。