在字符串中查找每个捕获组的位置

时间:2014-07-22 21:56:37

标签: ruby regex

我找到了如何在一个字符串中得到一个匹配的偏移量,每个匹配的起始位置......但我找不到一个简单的方法来找到一个开始捕获组的字符串中的位置。 / p>

string.scan(regex) do |match|
    positions << Regexp.last_match.offset(0)[1]
end

这段代码只给出了字符串中每个匹配的开始位置。我会

也许我是一个糟糕的Google员工,在这种情况下,我很抱歉。提前谢谢你的帮助。

编辑3:重复数据我的问题似乎是"Find both pattern and position of multiple regex matches in Ruby"的重复数据。我在问之前看到了这个问题,但我不明白我找到了我想要的东西。我的错。但我认为我在这里得到的答案不像其他人那么“神秘”。谢谢。

修改1:

我使用DNA序列。例如,我有这个字符串和这个正则表达式:

string = "ggtgtcaactatccgccgcgaagcacgtaacgtctctcttgacaccgaatcataggtgcgacagt"
regex = /cg(.)a(.)/

我想知道所捕捉角色的每个位置。所以:

[20, 22, 27, 29, 47, 49]

编辑2:解决方案 感谢@ 7stud

string = "ggtgtcaactatccgccgcgaagcacgtaacgtctctcttgacaccgaatcataggtgcgacagt"
regex = /cg(.)a(.)/
positions = Array.new
string.scan(regex) do
  md = Regexp.last_match
  md.captures.each_with_index { |capture, i|
      positions << md.begin(i + 1)
  }
end
p positions.to_a

1 个答案:

答案 0 :(得分:1)

  

我找不到一个简单的方法来找到一个开始捕获组的字符串中的位置。

像这样:

str = 'aa123bb456'

str.scan(/(.)(.)(\d+)/) do 
  md = Regexp.last_match
  p md.offset(1)
  p md.offset(2)
  p md.offset(3)
  puts '-' * 20
end



--output:--
[0, 1]
[1, 2]
[2, 5]
--------------------
[5, 6]
[6, 7]
[7, 10]

在第一场比赛中,字符串中捕获组的开头为0,1,2,对于第二场比赛,捕获组的开头为5,6,7。

或者,如果你只想要开始每次捕获,就像hwnd所示,你可以这样做:

str = 'aa123bb456'

str.scan(/(.)(.)(\d+)/) do 
  md = Regexp.last_match
  p md.begin(1)
  p md.begin(2)
  p md.begin(3)
  puts '-' * 20
end


--output:--
0
1
2
--------------------
5
6
7
--------------------
  

是的,但我不知道正则表达式会匹配多少次

这有什么关系?

对编辑的回应:

str = "ggtgtcaactatccgccgcgaagcacgtaacgtctctcttgacaccgaatcataggtgcgacagt"
regex = /cg(.)a(.)/

results = []

str.scan(regex) do 
  md = Regexp.last_match
  results << md.begin(1) << md.begin(2)
end

p results

--output:--
[20, 22, 27, 29, 47, 49]