更换,直到所有出现的情况都被移除

Joh*_*ith 3 ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我有以下字符串:

",||||||||||||||"
",|||||a|||||,|"
Run Code Online (Sandbox Code Playgroud)

我想实现所有事件",|"都被替换",,"

输出应如下:

",,,,,,,,,,,,,,,"
",,,,,,a|||||,,"
Run Code Online (Sandbox Code Playgroud)

当我.gsub(',|', ',,')在字符串上运行时,我得到的不是所需的输出.

",,|||||||||||||"
",,||||a|||||,,"
Run Code Online (Sandbox Code Playgroud)

那是因为它没有gsub多次运行.是否有类似的递归运行方法.

Ama*_*dan 8

正则表达式匹配不能重叠.因为匹配是用于替换的,所以你不能这样做.这是两个解决方法:

str = ",|||||a|||||,|"
while str.gsub!(/,\|/, ',,'); end

str = ",|||||a|||||,|"
str.gsub!(/,(\|+)/) { "," * ($1.length + 1) }
Run Code Online (Sandbox Code Playgroud)


ndn*_*kov 5

smoke_weed_every_day = lambda do |piper|
  commatosed = piper.gsub(',|', ',,')
  commatosed == piper ? piper : smoke_weed_every_day.(commatosed)
end

smoke_weed_every_day.(",||||||||||||||") # => ",,,,,,,,,,,,,,,"
smoke_weed_every_day.(",|||||a|||||,|")  # => ",,,,,,a|||||,,"
Run Code Online (Sandbox Code Playgroud)

  • 非常聪明的解决方案 (2认同)