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 的输出完全相同。知道如何解决我的问题吗?
=> str.match(/\[\[(.*)\]\].*\[\[(.*)\]\]/).captures
=> ["lead:first_name", "client:last_name"]
=> 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"]
我希望构建一个 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 的输出完全相同。知道如何解决我的问题吗?
=> str.match(/\[\[(.*)\]\].*\[\[(.*)\]\]/).captures
=> ["lead:first_name", "client:last_name"]
=> 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"]