2010-01-19 105 views
2

我有一个包含多行的字符串变量:使用ruby多行匹配

"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斯威克”开头的行,并提取匹配的整数部分的值...

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 

然而,这只是抓住了第一场比赛的价值而不是我想要的那样。 任何想法我可能做错了什么? 谢谢

回答

2

要捕获组使用String#scan

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

谢谢!得到它了! – eastafri 2010-01-19 13:22:32

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