我希望构建一个 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/