我的目标是将任意两个连续的逗号变成",NA,"
。这意味着:
-
str = ",,,123,,BLAH,,"
对",NA,123,NA,BLAH,NA,"
的更改 -
",,,"
对",NA,NA,"
的更改 -
",,,,"
对",NA,NA,NA,"
的更改 -
",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,"
正则表达式/,+/
匹配"一个或多个"逗号