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

ruby regex to match multiple occurrences of pattern

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

这是我所做的:

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

上面的正则表达式不起作用,因为它return是这样的:

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

当我想要的是:

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

我想如果我使用非捕获组肯定可以解决问题:

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

但是非捕获组 return 的输出完全相同。知道如何解决我的问题吗?

Try this:

 => str.match(/\[\[(.*)\]\].*\[\[(.*)\]\]/).captures
 => ["lead:first_name", "client:last_name"] 

With many occurrences:

 => str
 => "Some [[lead:first_name]] random text[[lead:first_name]] and more [[lead:first_name]] stuff [[client:last_name]]" 
 => str.scan(/\[(\w+:\w+)\]/)
 => [["lead:first_name"], ["lead:first_name"], ["lead:first_name"], ["client:last_name"]] 

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

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

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

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