多线匹配红宝石

时间:2010-01-19 12:50:22

标签: ruby regex

我有一个包含多行的字符串变量:例如

"SClone VARPB63A\nSeq_vec SVEC 1 65 pCR2.1-topo\nSequencing_vector \"pCR2.1-topo\"\nSeq_vec SVEC 102 1710 pCR2.1-topo\nClipping QUAL 46 397\n

我希望得到以“Seq_vec SVEC”开头的两行,并提取匹配的整数部分的值...

string = "Clone VARPB63A\nSeq_vec SVEC 1 65 pCR2.1-topo\nSequencing_vector \"pCR2.1-topo\"\nSeq_vec SVEC 102 1710 pCR2.1-topo\nClipping QUAL 46 397\n"

seqvector = Regexp.new("Seq_vec\\s+SVEC\\s+(\\d+\\s+\\d+)",Regexp::MULTILINE )
vector = string.match(seqvector)
        if vector
           vector_start,vector_stop = vector[1].split(/ /)
           puts vector_start.to_i
           puts vector_stop.to_i
         end

然而,这只会抓住第一场比赛的值,而不是我想要的第二场比赛。 我有什么想法可能做错了吗? 谢谢

3 个答案:

答案 0 :(得分:2)

要使用String#scan

捕获群组
vector = string.scan(seqvector)
=> [["1 65"], ["102 1710"]]

答案 1 :(得分:2)

match找到第一场比赛。要查找所有匹配项,请使用String#scan,例如

string.scan(seqvector)
=> [["1 65"], ["102 1710"]]

或对每场比赛做点什么:

string.scan(seqvector) do |match|
  # match[0] will be the substring captured by your first regexp grouping
  puts match.inspect
end

答案 2 :(得分:1)

为了使这更容易处理,我会先将整个字符串拆分成一个数组然后执行:

string = "SClone VARPB63A\nSeq_vec SVEC 1 65 pCR2.1-topo\nSequencing_vector \"pCR2.1-topo\"\nSeq_vec SVEC 102 1710 pCR2.1-topo\nClipping QUAL 46 397\n"

selected_strings = string.split("\n").select{|x| /Seq_vec SVEC/.match(x)}


selected_strings.collect{|x| x.scan(/\s\d+/)}.flatten # => [" 1", " 65", " 102", " 1710"]