正则表达式 - 在每个组中获取多个匹配项
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"]
我有这样一个字符串:
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"]