正则表达式 - 在每个组中获取多个匹配项

Regular expression - get multiple matches into each group

我有这样一个字符串: raw_string = "(a=1)(b=2)(c=3)"

我想匹配这个并获取每组括号内的值,并将每个结果放在一个组中。 例如:

组 0 = "a=1"

第 1 组 = "b=2" 依此类推..

我已经试过 /(\(.*\))/g 但它似乎不起作用。有人可以帮我解决这个问题吗?

谢谢!

str = "(a=1)(b=2)  (c=3)"

正如@stribizhev 在评论中所建议的那样:

r = /
    \(       # Match a left paren
    ([^\)]+) # Match >= 1 characters other than a right paren in capture group 1
    \)       # Match a right paren
    /x       # extended/free-spacing regex definition mode

str.scan(r).flatten
  #=> ["a=1", "b=2", "c=3"] 

注意 ([^\)]+) 可以替换为 (.+?),使其成为任何字符的惰性匹配,正如我在这个替代正则表达式中所做的那样,它使用环视而不是捕获组:

r = /
    (?<=\()  # Match a left paren in a positive lookbehind
    .+?      # Match >= 1 characters lazily
    (?=\))   # Match a right paren in a positive lookahead
    /x

这里的 lookbehind 可以替换为 \(\K,即 "match a left paren then forget about everything matched so far"。

最后,您可以在右边使用 String#split 然后用左括号,可能用空格分隔,然后删除第一个左括号和最后一个右括号:

str.split(/\)\s*\(/).map { |s| s.delete '()' }
  #=> ["a=1", "b=2", "c=3"] 

如果我们能写成 s.strip(/[()]/) 不是很好吗?

如果你的意思是带括号的模式正好出现三次(或不同的固定次数),那么是可以的,但如果你希望模式出现任意次数,那么你不能正则表达式只能有固定数量的捕获或命名捕获。

只是为了表明您可以将它们放入任意数量的捕获组中:

"(a=1)(b=2)(c=3)"[/#{'(?:\((.*?)\))?' * 99}/]
[, , ]
#=> ["a=1", "b=2", "c=3"]