通过多次扫描替换字符串中的单词

时间:2015-03-15 00:46:56

标签: ruby

我的目标是将任意两个连续逗号转换为",NA,"。这意味着:

  1. str = ",,,123,,BLAH,,"更改为",NA,123,NA,BLAH,NA,"
  2. ",,,"更改为",NA,NA,"
  3. ",,,,"更改为",NA,NA,NA,"
  4. ",blah,,hi,"更改为",blah,NA,hi,"
  5. 字符串中可能有1到100,000个逗号,逗号之间有任意数量的字符。我的代码是:

    str = str.gsub!(",,",",NA,")
    # => ",NA,123,NABLAH,NA"
    

    我遇到了问题,因为它需要多次发生。如果我多次重复gsub,我会遇到错误undefined method gsub! for nil class,因为gsub会返回结果,但如果没有替换,则会返回nil

2 个答案:

答案 0 :(得分:2)

ruby > ",,,,,,,,,,,,,,,,,,,,,,".gsub(",",",NA")
=> ",NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA" 

或者:

 ruby > ",,,,,,,,,,,,,,,,,,,,,,".gsub(",","NA,")
 => "NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA,NA," 

修改:更好地处理用例(没有得到原始问题):

2.2.0 :004 > str=",,,123,,BLAH,,"
 => ",,,123,,BLAH,," 
2.2.0 :005 > str.split(",")
 => ["", "", "", "123", "", "BLAH"] 
2.2.0 :006 > str.split(",").map{|x|x.length == 0 ? "NA" : x}.join(",")
 => "NA,NA,NA,123,NA,BLAH" 

答案 1 :(得分:0)

根据您的使用案例(" ,,, 123 ,, BLAH ,,"变成",NA,123,NA,BLAH,NA,")I& #39; m假设您希望字符之间的所有逗号变为NA,?

使用带有gsub的正则表达式可以轻松完成。

str=",,,123,,BLAH,,"
str.gsub!(/,+/,",NA,") #returns ",NA,123,NA,BLAH,NA,"

正则表达式/,+/匹配一个或多个'逗号