ruby正则表达式匹配多次出现的模式
我希望构建一个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
但非捕获组返回相同的错误输出。 关于如何解决我的问题的任何想法?
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"]]
你的正则表达式的问题是.+
部分是“贪婪的”,这意味着如果正则表达式匹配字符串的较小和较大部分,它将捕获较大的部分( 更多关于贪婪的正则表达式 )。
在Ruby(以及大多数正则表达式语法)中,您可以使用?
来限定+
量词?
使它不贪心。 所以你的正则表达式将变成/( /(?:\[\[(.+?)\]\])+/
。+?) /(?:\[\[(.+?)\]\])+/
。
但是,您会注意到这仍然不适用于您想要做的事情。 Ruby捕获组在重复组内部不起作用。 对于您的问题,您需要使用scan
:
"[[a]][[ab]][[abc]]".scan(/\[\[(.+?)\]\]/).flatten => ["a", "ab", "abc"]