我的目标是将任意两个连续逗号转换为",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
。
答案 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,"
正则表达式/,+/
匹配一个或多个'逗号