从正则表达式中检索多个匹配的标记

时间:2013-11-26 20:00:02

标签: ruby regex

这就是我想要发生的事情

> /x(y\d)*/.somefunction('xy1y2y3').each { |x| puts x }
y1
y2
y3

这似乎是正则表达式中星号的一种非常自然的用法。我已经匹配了一堆令牌,我希望它们打印出来。

我能找到的最接近的是:

/x((y\d)*)/.match('xy1y2y3')[1].scan(/y\d/).each { |x| puts x }

这真是太糟糕了。

3 个答案:

答案 0 :(得分:1)

您遇到的问题与正则表达式而不是Ruby有关。 You are repeating a capture group rather than capturing a repeated group。你可以用

str.scan(/x((?:y\d)*)/)

但是,这将捕获组合为一个字符串的所有组。为了做你真正想做的事情(检查字符串是否遵循模式x后跟这些组),你不幸的是需要在你的问题中做两个步骤。或者,或者您可以删除附加要求,并仅像其他答案所建议的那样搜索模式。

答案 1 :(得分:0)

我认为这就是你想要的:

'xy1y2y3'.gsub(/y\d/) { |s| puts s }

gsub方法接受一个块。

答案 2 :(得分:0)

根据您的输入和输出,这看起来是正确的:

'xy1y2y3'.scan(/y\d/)
# => ["y1", "y2", "y3"]

如果要打印它们,请使用此选项:

puts 'xy1y2y3'.scan(/y\d/)
# >> y1
# >> y2
# >> y3

如果您想查看字符串并捕获重复模式,则字符串scan是您的朋友。