简体   繁体   中英

Removing characters by index from Ruby String

Given a sequence of inclusive string indexes,

str_indices = [[1,2],[7,8]],

what's the best way to exclude these from a string?

For example, given the above indices marked for exclusion and the string happydays , I'd like hpyda to be returned.

Using Ranges:

str_indices=[[1,2],[7,8]]
str="happydays"
str_indices.reverse.each{|a| str[Range.new(*a)]=''}
str
=> "hpyda"

If you don't want to modifty the original:

str_indices.reverse.inject(str){|s,a|(c=s.dup)[Range.new(*a)]='';c}

Guess this is the best way of doing it.

str_indices = str_indices.flatten.reverse
string = "happydays"
str_indices.each{|i| string[i]=""}

For ruby 1.9,

string = 'happydays'
[-1, *str_indices.flatten(1), 0].each_slice(2).map{|i, j| string[i+1..j-1]}.join

For ruby 1.8, write require 'enumerator' before this.

[[1,2],[7,8]].reverse.inject('happydays') { |m, (f,l)| m[f..l] = ''; m }

The following does not require the ranges identified by str_indices to be non-overlapping or ordered in any way.

str_indices = [[4,6], [1,2], [11,12], [9,11]]
str = "whatchamacallit"

keeper_indices = str.size.times.to_a -
                 str_indices.reduce([]) { |a,(from,to)| a | (from..to).to_a }
  # => [0, 3, 7, 8, 13, 14]

str.chars.values_at(*keeper_indices).join
  #=> "wtmait"

Just for fun :)

str_indices = [[1,2],[7,8]]
str = "happydays"
str_indices.flatten.reverse.inject(str.split("")){|a,i| a.delete_at i; a}.join
#=> hpyda

If you use a functional programming approach, you don't have to worry about the order of indexes

str = "happydays"
indexes_to_reject = [[1,7],[2,8]] # Not in "correct" order, but still works
all_indexes = indexes_to_reject.flatten(1)
str.each_char.reject.with_index{|char, index| all_indexes.include?(index)}.join

It also works with ranges:

str = "happydays"
ranges_to_reject = [1..2, 7..8]
str.chars.reject.with_index {|char, index| 
  ranges_to_reject.any?{|range| range.include?(index)}
}.join

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM