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

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

This is what I want

#<MatchData "%span.rockets#diamonds.ribbons.forever" 1:"%span" 2:".rockets" 3:".#diamonds" 4:".ribbons" 5:".forever">

需要帮忙吗?我试过但失败了 :(

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


3

这就是捕获组的工作原理。如果你想保存所有这些子字符串,将量词放在捕获组内部

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

然后您的第二个捕获将是:
2:".rockets#diamonds.ribbons.forever"

...并且你可以自己进一步拆分它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接