我想使用正则表达式来检查给定的字符串是否由某些子字符串组成。
例如,给定正则表达式
> regex = /(?:(foo)|(bar)|(baz))*/
我可以确定给定的字符串是否与模式匹配:
> regex === "bazbar"
=> true
> regex === "qux"
=> false
但我想知道如何将字符串分解为子字符串。我几乎可以做到这一点
> regex.match("barbazfoo").captures
=> ["foo", "bar", "baz"]
但在这里它们按照我在正则表达式中指定的顺序出现。我要回来
["bar", "baz", "foo"]
按照它们在字符串中出现的顺序。
最佳答案
您可以使用String#scan
使用修改后的正则表达式:
regex = /foo|bar|baz/
"barbazfoo".scan(regex)
# => ["bar", "baz", "foo"]
更新根据OP的评论。
如果我使用的某些字符串是其他字符串的子字符串,则需要进行排序,以便所有子字符串都放在最后。
"barfoo".scan(/ba|bar|foo/) # without ordering
# => ["ba", "foo"]
words = ['ba', 'bar', 'foo']
pattern = words.map { |word| Regexp.escape(word) }.sort_by { |x| -x.size }.join('|')
"barfoo".scan(Regexp.new(pattern))
# => ["bar", "foo"]
关于ruby - 是否有一个 Ruby Regex.match 版本可以响应字符串中匹配的顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25819437/