4

我已经看到这个问题被问到并回答了 javascript regex,答案很长而且很丑陋。好奇是否有人有更清洁的方式在 ruby​​ 中实现。

这是我想要实现的目标:

测试字符串: "foo bar baz"
正则表达式: /.*(foo).*(bar).*/
预期回报: [[0,2],[4,6]]

所以我的目标是能够运行一个方法,传入测试字符串和正则表达式,这将返回每个捕获组匹配的索引。我已将捕获组的起始和结束索引都包含在预期收益中。我将继续努力,并在此过程中添加我自己的潜在解决方案。当然,如果除了正则表达式之外还有一种更清洁/更容易实现这一目标的方法,那也是一个很好的答案。

4

2 回答 2

5
m = "foo bar baz".match(/.*(foo).*(bar).*/)
[1, 2].map{|i| [m.begin(i), m.end(i) - 1]}
# => [[0, 2], [4, 6]]
于 2013-07-18T17:16:35.250 回答
5

这样的事情应该适用于一般数量的比赛。

def match_indexes(string, regex)
  matches = string.match(regex)

  (1...matches.length).map do |index|
    [matches.begin(index), matches.end(index) - 1]
  end
end

string = "foo bar baz"

match_indexes(string, /.*(foo).*/)
match_indexes(string, /.*(foo).*(bar).*/)
match_indexes(string, /.*(foo).*(bar).*(baz).*/)
# => [[0, 2]]
# => [[0, 2], [4, 6]]
# => [[0, 2], [4, 6], [8, 10]]

您可以查看(有点奇怪的) MatchData 类,了解它是如何工作的。http://www.ruby-doc.org/core-1.9.3/MatchData.html

于 2013-07-18T17:27:42.573 回答