在同一时间将html插入多个位置的字符串中

时间:2014-02-11 15:37:09

标签: html ruby

所以我有一个Peptide,它是一串字母,对应于氨基酸 说肽是

peptide_sequence = "VEILANDQGNR"

L 位置 4 R 位置 11

我想在这些位置之前和之后同时插入"<span class=\"modified_aa\"></span>

以下是我的尝试:

我的修改存储在对象修改的数组pep_mods中,其中包含具有位置的属性位置,在本例中为4和11

pep_mods.each do |m|
  peptide_sequence.gsub(peptide_sequence[m.position.to_i-1], "<span class=\"mod\">#{@peptide_sequence[m.location.to_i-1]}</span>" )
end

但是,由于在第一次插入html span标签后有两处修改,字符串中的位置变得完全不同

我怎样才能实现我打算做的事情?我希望很清楚

3 个答案:

答案 0 :(得分:3)

你应该倒退 - 从最后一个开始进行修改。这样,早期修改的索引就不会改变。

您可能需要以相反的顺序对索引数组进行排序 - 然后您可以使用当前的代码。

答案 1 :(得分:1)

Floris的回答是正确的,但如果你想这么做(O(n^2)而不是O(nlgn)),这就是基本的想法。

如果每个字符都有一个与其中一个修改对应的索引,则可以迭代字符检查,而不是依赖gsub。如果索引匹配,请执行修改。否则,请保留原始字符。

modified = peptide_sequence.each_with_index
                           .to_a 
                           .map do |c, i|
                              pep_mods.each do |m|
                                if m.location.to_i = i
                                  %Q{<span class="mod">#{c}</span>}
                                else
                                  c
                                end
                              end
                          end.join('')

答案 2 :(得分:0)

好的,以防这对其他人有帮助,这就是我最终做到的方式:

我首先将肽序列转换为数组:

pep_seq_arr = peptide_sequence.split("")

然后使用each_with_index作为Casey提到的

pep_seq_arr.each_with_index do |aa, i|
  pep_mods.each do |m|
    pep_seq_arr[i] = "<span class='mod'>#{aa}</span>" if i == m.location.to_i-1
  end
end

最后加入了数组:

pep_seq_arr.join

比我初想的容易