正则表达式 - 保存重复捕获的组

And*_*own 5 ruby regex capturing-group

这就是我正在做的事情

a = "%span.rockets#diamonds.ribbons.forever"
a = a.match(/(^\%\w+)([\.|\#]\w+)+/)
puts a.inspect
Run Code Online (Sandbox Code Playgroud)

这就是我得到的

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever">
Run Code Online (Sandbox Code Playgroud)

这就是我要的

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever">
Run Code Online (Sandbox Code Playgroud)

救命?我尝试过但失败了:(

Kob*_*obi 8

通常,您无法获得任意数量的捕获组,但如果您使用scan,则可以获取要捕获的每个标记的匹配项:

a = "%span.rockets#diamonds.ribbons.forever"
a = a.scan(/^%\w+|\G[.|#]\w+/)
puts a.inspect

["%span", ".rockets", "#diamonds", ".ribbons", ".forever"]
Run Code Online (Sandbox Code Playgroud)

这与你的正则表达式没什么不同,但我删除了最后一个标记的重复.\G不太知名 - 它告诉引擎匹配前一个匹配结束的位置,所以当match(%span :P .rockets)之间有额外的字符时它不会中断.

通常,如果你有原始正则表达式的多个匹配项,这个方法可能会添加一些工作,因为你没有将组分开匹配,但是因为match返回单个结果它应该可以正常工作.

工作示例:http://ideone.com/nnmki


Ala*_*ore 3

这就是捕获组的工作原理。如果要保存所有这些子字符串,请将量词放入捕获组内:

a = a.match(/(^%\w+)((?:[.#]\w+)+)/)
Run Code Online (Sandbox Code Playgroud)

那么你的第二次捕获将是:

2:".rockets#diamonds.ribbons.forever"
Run Code Online (Sandbox Code Playgroud)

...你可以自己分解剩下的部分。