在 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 模式生成字符串的主要内容,如果未能解决你的问题,请参考以下文章