многострочное сопоставление с ruby - PullRequest
2 голосов
/ 19 января 2010

У меня есть строковая переменная с несколькими строками: например,

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

2 голосов
/ 19 января 2010

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 голосов
/ 19 января 2010

Для захвата групп используйте String # scan

vector = string.scan(seqvector)
=> [["1 65"], ["102 1710"]]
1 голос
/ 19 января 2010

Чтобы сделать это немного проще, я сначала разбил бы всю строку на массив, а затем сделал бы:

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"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...