这就是我正在做的事情
a = "%span.rockets#diamonds.ribbons.forever"
a = a.match(/(^\%\w+)([\.|\#]\w+)+/)
puts a.inspect
这就是我得到的
#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".forever">
这就是我想要的
#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever">
帮助?我尝试过但都失败了:(
答案 0 :(得分:8)
通常,您无法获得任意数量的捕获组,但如果您使用scan
,则可以为要捕获的每个令牌获取匹配:
a = "%span.rockets#diamonds.ribbons.forever"
a = a.scan(/^%\w+|\G[.|#]\w+/)
puts a.inspect
["%span", ".rockets", "#diamonds", ".ribbons", ".forever"]
这与你的正则表达式没什么不同,但我删除了最后一个标记的重复。 \G
并不太知名 - 它告诉引擎匹配上一个匹配结束的位置,因此当匹配项之间有额外的字符时,它不会中断(%span :P .rockets
)。
通常情况下,如果您的原始正则表达式有多个匹配项,则此方法可能会添加一些工作,因为您没有将组分隔为匹配项,但由于match
返回单个结果,因此它应该可以正常工作。 / p>
答案 1 :(得分:3)
这就是捕获小组的工作方式。如果要保存所有这些子串,请将量词放在捕获组中:
a = a.match(/(^%\w+)((?:[.#]\w+)+)/)
然后你的第二次捕获将是:
2:".rockets#diamonds.ribbons.forever"
......你可以自己完成剩下的工作。