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



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

  1. str = ",,,123,,BLAH,,"",NA,123,NA,BLAH,NA,"的更改
  2. ",,,"",NA,NA,"的更改
  3. ",,,,"",NA,NA,NA,"的更改
  4. ",blah,,hi,"",blah,NA,hi,"的更改

字符串中可能有 1 到 100,000 个逗号之间的任何位置,逗号之间可能有任意数量的字符。我的代码是:

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

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

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" 

根据您的用例(",,,123,,BLAH,","变成",NA,123,NA,BLAH,NA,")我假设您希望字符之间的所有逗号都变成,NA,?

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

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

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

最新更新