在Ruby中,我有一串相同的字符 - 让我们说它们都是感叹号,就像在!!!!
中一样。如果对应于该索引的整数满足某些条件,我想用'*'替换某些索引处的字符。
例如,假设我想要替换索引为偶数且大于3的所有字符。在字符串!!!!!!!!
(长度为8个字符)中,这会导致!!!!*!*!
(索引) 4和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}/,"*!")