我有一个包含多行的字符串变量:例如
"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
然而,这只会抓住第一场比赛的值,而不是我想要的第二场比赛。 我有什么想法可能做错了吗? 谢谢
答案 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"]