ruby 正则表达式匹配多次出现的模式

标签 ruby regex

我希望构建一个 ruby​​ 正则表达式来匹配多次出现的模式并将它们返回到一个数组中。模式很简单:[[.+]]。即,两个左括号,一个或多个字符,后跟两个右括号。

这是我所做的:

str = "Some random text[[lead:first_name]] and more stuff [[client:last_name]]"
str.match(/\[\[(.+)\]\]/).captures

上面的正则表达式不起作用,因为它返回了这个:

["lead:first_name]] and another [[client:last_name"]

当我想要的是:

["lead:first_name", "client:last_name"] 

我想如果我使用一个非捕获组肯定能解决问题:

str.match(/(?:\[\[(.+)\]\])+/).captures

但是非捕获组返回完全相同的错误输出。关于如何解决我的问题的任何想法?

最佳答案

你的正则表达式的问题是 .+ 部分是“贪婪的”,这意味着如果正则表达式匹配字符串的较小部分和较大部分,它将捕获较大部分( more about greedy regexes ).

在 Ruby(和大多数正则表达式语法)中,您可以使用 ? 限定您的 + 量词,使其成为非贪婪的。所以你的正则表达式将变成 /(?:\[\[(.+?)\]\])+/

但是,您会发现这仍然无法满足您的需求。 Ruby 捕获组在重复组中不起作用。对于您的问题,您需要使用 scan :

"[[a]][[ab]][[abc]]".scan(/\[\[(.+?)\]\]/).flatten
    => ["a", "ab", "abc"]

关于ruby 正则表达式匹配多次出现的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27881549/

相关文章:

javascript - 提取元素内的所有有效 URL 字符串 (JavaScript)

java - 如果多个字符可以包含数字和下划线(最多 128 个),则正则表达式的第一个字符必须是字母

regex - Go 正则表达式中的否定前瞻

如果在没有 shell 的情况下运行,Ruby 将以退出代码 1 响应 TERM 退出

python - 什么正则表达式匹配这种类型的时间戳

javascript - 如果 JavaScript 弹出窗口打开,如何编写 Watir 条件循环来单击 "OK"按钮?

ruby-on-rails - ActionMailer 不使用默认值或任何 "from"

java - 如何检查正则表达式不起作用的原因?

ruby-on-rails - 如何修复在 Rails 中自动加载常量错误时检测到的循环依赖?

ruby - 在 Ruby 中,返回 'enumerable' 是什么意思