Ruby 每隔一个字符替换一次

Ruby 每隔一个字符替换一次,ruby,regex,Ruby,Regex,如何用正则表达式跳过或替换其他字符(可以是任何字符) "abc123.-def45".gsub(/.(.)?/, '@') 得到 "a@c@2@.@d@f@5" 替换第一个字符,并将其写回: "abc123.-def45".gsub(/(.)./, '\1@') 重要的是不要让第二个字符成为可选字符。否则,在奇数长度字符串中,最后一个字符将导致匹配,并将追加一个@。如果没有?,最后一个字符将失败并保持不变 您也可以这样做,以避免按顺序替换@ "abc123.-def45".gsub(/([

如何用正则表达式跳过或替换其他字符(可以是任何字符)

"abc123.-def45".gsub(/.(.)?/, '@')
得到

"a@c@2@.@d@f@5"
替换第一个字符,并将其写回:

"abc123.-def45".gsub(/(.)./, '\1@')
重要的是不要让第二个字符成为可选字符。否则,在奇数长度字符串中,最后一个字符将导致匹配,并将追加一个
@
。如果没有
,最后一个字符将失败并保持不变


您也可以这样做,以避免按顺序替换@

"abc123.-def45".gsub(/([^@])[^@]/, '\1@')

以下代码也将起作用:

irb(main):005:0> "abc123.-def45".chars.each_with_index.map {|e,i| !i.even? ? e = "@" : e}.join
=> "a@c@2@.@d@f@5"

但如果只有一个
@
,则这将抵消1的交替(从而替换奇数而不是偶数位置)。例如,
abcd@efgh
将导致
a@c@@e@g@
而不是
a@c@@@f@h
。感谢你们两位展示了使用正则表达式的不同方法