我在字符串中有一些序列用“@number”表示(/ @ \ d /)
我想删除任何冗余序列,其中@ 2后跟@ 2,
如果在文本中的某个地方之后直接找到另一个相同的@number序列,我只想删除它们,因此对于@2lorem@2ipsum
,第二个@ 2被删除,但是@2lorem@1ipsum@2dolor
没有删除任何内容,因为@ 1介于两者之间两个@ 2序列。
"@2randomtext@2randomtext@2randomtext@1bla@2bla2@2bla2"
变为:
"@2randomtextrandomtextrandomtext@1bla@2bla2bla2
答案 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
返回