如何在Ruby中添加00,000,111,111等

时间:2014-05-03 12:34:17

标签: ruby gsub

我有一个字符串输入,我想在,00之间插入11,如下例所示。

input1 = '00011010100011101'
desired_result1 = '0,0,01,101010,0,01,1,101'

input2 = '11010111101010000001011'
desired_result2 = '1,10101,1,1,101010,0,0,0,0,0101,1'

我尝试了以下但是没有给我我想要的东西。

input1.gsub(/00/,'0,0').gsub(/11/,'1,1')
=> "0,001,101010,001,1101"

我感谢任何投入。

注意此问题的答案可能会在以后默默使用here而不会获得积分。

4 个答案:

答案 0 :(得分:5)

这样做的一种方法是使用lookbehind((?<=...))。这是一个无法捕获的零宽度断言,因此您可以匹配1之前的1或0之前的0:

input.gsub(/(?<=1)1|(?<=0)0/, ',\0')

\0是匹配的字符串,即10,但不是前面的10

Here is a good guide on lookahead and lookbehind

答案 1 :(得分:3)

input.gsub(/(00+|11+)/) { |m| m.split(//).join(',') }
# => "0,0,01,101010,0,01,1,101"

答案 2 :(得分:3)

看,马,没有gsub,没有正则表达式!

def insert_commas(str)
  ([str[0]] + str.chars.each_cons(2).map { |a,b| a==b ? ','+b : b }).join('')
end

insert_commas('00011010100011101')
  #=> "0,0,01,101010,0,01,1,101"
insert_commas('11010111101010000001011')
  #=> "1,10101,1,1,101010,0,0,0,0,0101,1"

答案 3 :(得分:2)

Generaling @ spickermann的解决方案:

input1.gsub(/(.)\1+/) { |m| m.split('').join(',') }
# => "0,0,01,101010,0,01,1,101"