ruby - 是否有一个 Ruby Regex.match 版本可以响应字符串中匹配的顺序?

标签 ruby regex

我想使用正则表达式来检查给定的字符串是否由某些子字符串组成。

例如,给定正则表达式

> 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/

相关文章:

ruby-on-rails - 更新的 RubyGems:未初始化的常量 Gem::ConfigFile::RbConfig

Ruby - 将多行字符串居中

java - 正则表达式不返回 .group() 值

c# - 如何计算目录中文件的匹配数

regex - 基于字符串中大写/小写和位置的德语元音变音的 Powershell 正则表达式

Ruby 文本分析

ruby - 如何通过匹配 Capybara 中元素的精确文本来查找元素

ruby - 发现在 git 提交中修改了哪些方法和类?

Python正则表达式-获取时间和日期

c# - 使用 C# 和正则表达式解析源代码并查找带参数的函数调用