如何在Ruby中的特定索引处从String中删除字符

时间:2017-05-08 20:18:33

标签: ruby string

我有一些像这样的字符串:

  • 'Set{[5, 6, 9]}'
  • 'Set{[8, 4, "a", "[", 1]}'
  • 'Set{[4, 8, "]", "%"]}'

我想从这些字符串中删除索引4和-2处的方括号,以便我有:

  • 'Set{5, 6, 9}'
  • 'Set{8, 4, "a", "[", 1}'
  • 'Set{4, 8, "]", "%"}'

我该怎么做?

2 个答案:

答案 0 :(得分:4)

我想你想要这个:

>> string = 'Set{[8, 4, "a", 6, 1]}'
=> "Set{[8, 4, \"a\", 6, 1]}"
>> string.gsub('{[', '{').gsub(']}', '}')
=> "Set{8, 4, \"a\", 6, 1}"

如果存在任何危险,您可能会在字符串中间看到'{['或']}'模式,并希望将其保留在那里,并且如果您确定相对于开头和结尾的位置每次都是字符串,你可以这样做:

>> string = 'Set{[8, 4, "a", 6, 1]}'
>> chars = string.chars
>> chars.delete_at(4)
>> chars.delete_at(-2)
>> chars.join
=> "Set{8, 4, \"a\", 6, 1}"

答案 1 :(得分:1)

由于您知道要删除的字符的位置,因此只需删除它们即可。以下方法分四步完成:

  • 将要删除的字符的负索引转换为非负索引。
  • 对索引进行排序。
  • 使用Array#reverse_each以相反的顺序处理索引。
  • 删除每个索引处的字符。

def remove_chars(str, *indices)      
  sz = str.size
  indices.map { |i| i >= 0 ? i : sz + i }.sort.reverse_each { |i| str[i] = '' }
  str
end

puts remove_chars('Set{[5, 6, 9]}', 4, -2 )
Set{5, 6, 9}

puts remove_chars('Set{[8, 4, "a", "[", 1]}', 4, -2 )
Set{8, 4, "a", "[", 1}

puts remove_chars('Set{[4, 8, "]", "%"]}', 4, -2 )
Set{4, 8, "]", "%"}

puts remove_chars('Set{[8, 4, "a", "[", 1]}', 23, 4, -2 )
Set{8, 4, "a", "[", 1

在最后一个示例中,字符串大小为24。

此方法会改变其运行的字符串。如果不更改字符串,请执行

remove_chars(str.dup, 4, -2 )

或向方法str_cpy = str.dup添加第一行并对str_cpy`进行操作。