如果前面有相同的序列,则从字符串中删除序列

时间:2013-03-10 00:54:10

标签: ruby regex

我在字符串中有一些序列用“@number”表示(/ @ \ d /) 我想删除任何冗余序列,其中@ 2后跟@ 2, 如果在文本中的某个地方之后直接找到另一个相同的@number序列,我只想删除它们,因此对于@2lorem@2ipsum,第二个@ 2被删除,但是@2lorem@1ipsum@2dolor没有删除任何内容,因为@ 1介于两者之间两个@ 2序列。

"@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"

变为:

"@2randomtextrandomtextrandomtext@1bla@2bla2bla2

4 个答案:

答案 0 :(得分:1)

您可以将其拆分为令牌:

my_string = "@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"
tokens = my_string.scan /(@\d+)?((?:(?!@\d+).)*)/
#=> [["@2", "randomtext"], ["@2", "randomtext"], ["@2", "randomtext"], ["@1", "bla"], ["@2", "bla2"], ["@2", "bla2"]]

然后chunk,map and join:

tokens.chunk{|x| x[0].to_s}.map{|n, v| [n, v.map(&:last)]}.join
#=> "@2randomtextrandomtextrandomtext@1bla@2bla2bla2"

答案 1 :(得分:1)

"@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2".gsub /(?<=(@\d))([^@]*)\1/,'\2'
=> "@2randomtextrandomtextrandomtext@1bla@2bla2bla2"

答案 2 :(得分:0)

my_string = "@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"

prev_sequence = String.new
penultimate_index = my_string.length - 2

for i in 0..penultimate_index
  if my_string[i] == '@'
    new_sequence = "@#{my_string[i+1]}"
    if new_sequence == prev_sequence
      my_string.slice!( i, 2 )
    else 
      prev_sequence = new_sequence
    end
  end
end


puts my_string

答案 3 :(得分:-1)

easy ...将您的字符串拆分为数组,然后比较之后的数字。如果它是相同的,删除它/他们。复杂(通过不那么多),是你不能在循环它们时从数组中删除条目...所以你需要做的是做一个递归函数...这里是伪:

- =全球价值= -
Decalre StringArray并将其设置为OriginalString.SplitOn(“@”)

- =方法RemoveLeadingDuplicates = -
申报柜台 声明RemoveIndex
StringArray中每个字符串的循环

如果先前的线索==当前的线索
设置RemoveIndex
从循环中断 否则
先前的线索=当前线索

增加计数器1 结束循环

如果RemoveIndex不为null
从数组中删除指定索引处的项目
调用RemoveLeadingDuplicates

返回