2010-01-19 81 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"]