代码之家  ›  专栏  ›  技术社区  ›  eastafri

ruby多行匹配

  •  2
  • eastafri  · 技术社区  · 15 年前

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

    "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 回复  |  直到 15 年前
        1
  •  2
  •   Jonas Elfström    15 年前

    要捕获组,请使用 String#scan

    vector = string.scan(seqvector)
    => [["1 65"], ["102 1710"]]
    
        2
  •  2
  •   mikej heading_to_tahiti    15 年前

    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
    
        3
  •  1
  •   nas    15 年前

    为了使这一点更容易处理,我将首先将整个字符串拆分为一个数组,然后执行以下操作:

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