5

这就是我正在做的

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">

帮助?我试过但失败了:(

4

2 回答 2

9

通常,您无法获得任意数量的捕获组,但如果您使用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返回单个结果,它应该可以正常工作。

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

于 2010-09-06T04:43:06.187 回答
3

这就是捕获组的工作方式。如果要保存所有这些子字符串,请将量词放在捕获组中:

a = a.match(/(^%\w+)((?:[.#]\w+)+)/)

然后您的第二次捕获将是:

2:".rockets#diamonds.ribbons.forever"

...你可以自己分解它的其余部分。

于 2010-09-06T04:25:12.790 回答