在 Ruby 中为 Regex 模式生成字符串

Posted

技术标签:

【中文标题】在 Ruby 中为 Regex 模式生成字符串【英文标题】:Generate string for Regex pattern in Ruby 【发布时间】:2014-01-31 18:47:42 【问题描述】:

在 Python 语言中,我发现 rstr 可以为 regex 模式生成字符串。

或者在Python中我们有这个可以返回字符串范围的方法:

re.sre_parse.parse(pattern)
#..... ('range', (97, 122)) ....

但是在 Ruby 中我没有找到任何东西。

那么如何在 Ruby 中为正则表达式模式生成字符串(反向正则表达式)?

我想做这样的事情:

"/[a-z0-9]+/".example
#tvvd
"/[a-z0-9]+/".example
#yt
"/[a-z0-9]+/".example
#bgdf6
"/[a-z0-9]+/".example
#564fb

"/[a-z0-9]+/" 是我的输入。 输出必须是我的正则表达式模式中可用的正确字符串。 这里的输出是: tvvd , yt , bgdf6 , 564fb “示例”方法生成它们。 我需要那个方法。

感谢您的建议。

【问题讨论】:

Generate random string based on Regex?的可能重复 【参考方案1】:

在 Ruby 中:

/qweqwe/.to_s
# => "(?-mix:qweqwe)"

当你声明一个Regexp时,你得到了Regexp类对象,要将其转换为String类对象,你可以使用Regexp的方法#to_s。在转换过程中,特殊字段将被扩展,如您在示例中所见。使用:

(使用 (?opts:source) 表示法。此字符串可以反馈到 Regexp::new 到与原始语义相同的正则表达式。

另外,你可以使用Regexp的方法#inspect,其中:

生成通常更易读的 rxp 版本。

/ab+c/ix.inspect        #=> "/ab+c/ix"

注意:以上方法仅用于将Regexp普通转换为String,为了匹配或选择一组字符串到另一个字符串,我们使用其他方法。例如,如果您有一个源数组(或字符串,您希望使用#split 方法对其进行拆分),您可以对其进行 grep,并获取结果数组:

array = "test,ab,yr,OO".split( ',' )
# => ['test', 'ab', 'yr', 'OO']

array = array.grep /[a-z]/
 # => ["test", "ab", "yr"]

然后将数组转换成字符串为:

array.join(',')
# => "test,ab,yr"

或者只使用#scan 方法,稍微改变正则表达式:

"test,ab,yr,OO".scan( /[a-z]+/ )
# => ["test", "ab", "yr"] 

但是,如果你真的需要一个随机字符串匹配正则表达式,你必须编写自己的方法,请参考post,或者使用ruby-string-random库。图书馆:

根据 Regexp 语法或模式生成随机字符串。

代码如下:

pattern = '[aw-zX][123]'
result = StringRandom.random_regex(pattern)

【讨论】:

你能解释一下如何使用它吗? 感谢您的重播,您能举个例子如何生成字符串吗?意思是当我告诉 /[a-z]/.... => 它向我展示例如“test,ab,yr,...” @MortezaIpo 一般没有,因为你没有源可供选择,它只是将正则表达式转换为字符串,但如果你有一个源数组,你可以grep它,得到结果数组:['test', 'ab', 'yr', 'OO'].grep /[a-z]/ # => ["test", "ab", "yr"]然后将数组转换为字符串:array.join(',') @MortezaIpo 如果我认为您不希望,请更新您的问题并提供适当的示例:您拥有什么,以及您希望结果是什么。 @MortezaIpo 我真的不明白,这是你的输入条件。例如,我有字符串,我应该应用一些规则来获取其他字符串。我看到了规则,也看到了输出,但没有看到输入。【参考方案2】:

也许你可以通过here找到你要找的东西。

【讨论】:

主要受这段代码的启发,我创建了一个 gem,它可以完成那里讨论的所有事情(以及更多):github.com/tom-lord/regexp-examples【参考方案3】:

聚会有点晚了,但是 - 最初受到这个 *** 线程的启发 - 我创建了一个强大的 ruby​​ gem 来解决原来的问题:

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']

【讨论】:

【参考方案4】:

你也可以使用 Faker gem https://github.com/stympy/faker 然后使用这个调用:

 Faker::Base.regexify(/[a-z0-9]10/)

【讨论】:

【参考方案5】:

更新:现在 string_pattern gem 支持正则表达式,比其他 gem 快 30 倍

require 'string_pattern'
/[a-z0-9]+/.generate

查看速度对比https://repl.it/@tcblues/Comparison-generating-random-string-from-regular-expression


我创建了一种使用模式生成字符串的简单方法,无需正则表达式的混乱,请查看 string_pattern gem 项目:https://github.com/MarioRuiz/string_pattern

要安装它:gem install string_pattern

这是一个使用示例:

# four characters. optional: capitals and numbers, required: lower
"4:XN/x/".gen    # aaaa, FF9b, j4em, asdf, ADFt

【讨论】:

以上是关于在 Ruby 中为 Regex 模式生成字符串的主要内容,如果未能解决你的问题,请参考以下文章

ruby 使用RegEx进行字符串提取 - 替换匹配

使用regex匹配Ruby子字符串,并像索引一样引用它

C#Regex使用匹配值替换

Ruby regex- gsub 是不是存储它匹配的内容?

如何从RegEx分组中“排除”空白区域?

C# RegEx:忽略大小写...在模式中?