2015-03-15 2 views
-2

Моя цель состоит в том, чтобы превратить любые две последовательные запятые в ",NA,". Это означает, что:Заменить слова в строке несколькими сканами

  1. str = ",,,123,,BLAH,," изменения ",NA,123,NA,BLAH,NA,"
  2. ",,," изменения в ",NA,NA,"
  3. ",,,," изменения в ",NA,NA,NA,"
  4. ",blah,,hi," изменения в ",blah,NA,hi,"

Там может быть где-то между 1 и 100000 запятые в строках с любым количеством символов rs между запятыми. Мой код:

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

У меня проблемы, потому что это должно произойти несколько раз. Если я повторяю gsub несколько раз, я нахожу ошибку undefined method gsub! for nil class, потому что gsub возвращает результат, но если нет подстановки, он возвращает nil.

+1

насчет нечетных чисел запятые, как в первом примере, который имеет три? –

+1

Вы меняете вопрос, а затем, перед лицом нового комментария, требующего уточнения, вы сразу же выбираете ответ ??? Кроме того, выбранный ответ приводит к '' ,, ". Gsub (", "," NA, ") # =>" NA, NA ", что противоречит вашему обновлению вопроса! –

+1

The downvote и голосовать, чтобы закрыть мои, потому что вопрос остается неясным. Для этого есть * prima facie *. Вы сказали, что каждая пара запятых должна быть преобразована в ', NA '. Простейшая возможная строка, которую мы можем применить, - это '' ,, ''(только две запятые), которая должна стать' ', NA,'', но ответ, который вы выбрали, этого не делает. –

ответ

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" 
+0

спасибо за ответ, но это не работает для этого случая: «,,,, hi ,,». Это оставляет меня: «, NA, NAhi, NA» (обратите внимание на недостаток пространства между hi и NA) – Rilcon42

+0

ОК, см. Последнее редактирование. – djvs

0

По вашему потребительной случае (",,, 123,, BLAH ,," превращение в ", NA, 123, NA, BLAH, NA,") Я предполагаю, что вы хотите все запятые между символами, чтобы включить, N ,?

Это легко сделать, используя регулярные выражения с gsub.

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

регулярное выражение /,+/ является соответствие «один или более» запятые

Смежные вопросы