根据某些规则替换Ruby字符串中的字符

时间:2009-11-19 13:43:47

标签: ruby

在Ruby中,我有一串相同的字符 - 让我们说它们都是感叹号,就像在!!!!中一样。如果对应于该索引的整数满足某些条件,我想用'*'替换某些索引处的字符。

例如,假设我想要替换索引为偶数且大于3的所有字符。在字符串!!!!!!!!(长度为8个字符)中,这会导致!!!!*!*!(索引) 4和6已被替换。)

最简洁的方法是什么?

6 个答案:

答案 0 :(得分:4)

这是一个将修改现有字符串的版本:

str = '!!!!!!!!'
str.split('').each_with_index do |ch, index|
  str[index] = '*' if index % 2 == 0 and index > 3
end

答案 1 :(得分:2)

对于那些像我一样沉迷于链式普查员给我们的无限可能性的人:

str = '!!!!!!!!'
res = '!!!!*!*!'

str.replace(str.chars.with_index.inject('') { |s, (c, i)|
  next s << c unless i%2 == 0 && i > 3
  s << '*'
})

require 'test/unit'
class TestStringReplacement < Test::Unit::TestCase
  def test_that_it_replaces_chars_at_even_indices_greater_than_3_with_asterisk
    assert_equal res, str
  end
end

答案 2 :(得分:1)

我也是Ruby的新手,但enum_with_index函数引起了我的注意。

第二次更新:这就是我的意思。此代码已经过测试。

"!!!!!!!".split('').enum_with_index.map{|c,i|(i%2==0 and i>3)?'*':c}.inject(""){|z,c|z+c}

答案 3 :(得分:0)

我是红宝石的新手,但我想我会试一试。迈克的回答要好得多。

str = '!!!!!!!!'
index = 0
str.each_char { |char|
        if (3 < index) && (index % 2 == 0) then
                str[index] = '*'
        end
        index = index + 1
}

puts str

修改

这是一个更好的解决方案,结合其他一些(已经过测试)。

str = '!!!!!!!!'
str.split('').each_with_index do |char, index| 3 < index and index % 2 == 0 ? str[index] = '*' : str[index] = char end
puts str

答案 4 :(得分:0)

可能是你能获得的最紧凑(肯定比其他解决方案更紧凑),但谁知道呢?

s="!!!!!!!!"
4.step(s.length-1, 2) {|i| s[i]="*"}
puts s

与其他解决方案相比,我也猜测它可能效率最高。

答案 5 :(得分:0)

regexp怎么样?

s="!!!!!!!!" 
puts s[0..3]+s[4..s.size].gsub(/!{2}/,"*!")