Подтвердить что ты не робот

Как безопасно заменить все пробелы символами подчеркивания рубином?

Это работает для любых строк с пробелами в них

str.downcase.tr!(" ", "_")

но строки, которые не имеют пробелов, просто удаляются

Итак, "Новая школа" изменится на "new_school", но "цвет" будет "", ничего!

4b9b3361

Ответ 1

Документы для tr! say

Translates str in place, using the same rules as String#tr. Returns str, or nil if no changes were made.

Я думаю, что вы получите правильные результаты, если вы используете tr без восклицания.

Ответ 2

с пространством

str = "New School"
str.parameterize.underscore

=> "new_school"

без пробела

str = "school"
str.parameterize.underscore

=> "school"

Изменить: - также мы можем передать '_' в качестве параметра для параметризации.

с пространством

str = "New School"
str.parameterize('_')

=> "new_school"

без пробела

str = "school"
str.parameterize('_')

=> "school"

Ответ 3

Если вам интересно получить строку в случай с змеей, то предлагаемое решение не совсем работает, потому что вы можете получить конкатенацию подчеркивания и начальные/конечные символы подчеркивания.

Например

1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :011 > str.downcase.tr(" ", "_")
  => "__john___smith_beer_"

Это решение ниже будет работать лучше:

1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :012 > str.squish.downcase.tr(" ","_")
  => "john_smith_beer" 

squish - это метод String, предоставляемый Rails

Ответ 4

Старый вопрос, но...

Для всех пробелов вы, вероятно, хотите что-то большее:

"hey\t there   world".gsub(/\s+/, '_') # hey_there_world

Это получает вкладки и новые строки, а также пробелы и заменяет собой один _.

Регулярное выражение может быть изменено в соответствии с вашими потребностями. Например:

"hey\t there   world".gsub(/\s/, '_') # hey__there___world

Ответ 5

str.downcase.tr(" ", "_")

Примечание: Нет "!"

Ответ 6

Вы также можете сделать str.gsub( "," _")

Ответ 7

str = "Foo Bar"
str.tr(' ','').underscore

=> "foo_bar"

Ответ 8

Если вы используете рельсы 5 и выше, вы можете достичь того же уровня с помощью

str.parameterize(separator: '_')