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

这就是我正在做的事情

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

这就是我得到的

 # 

这就是我要的

 # 

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

通常,您无法获得任意数量的捕获组,但如果使用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

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

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

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

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

……你可以自己分解其余部分。