Как я могу удалить строку «\ n» из строки Ruby?

115

У меня есть такая строка:

"some text\nandsomemore"

Мне нужно удалить с него "\ n". я пробовал

"some text\nandsomemore".gsub('\n','')

но это не работает. Как мне это сделать? Спасибо за прочтение.

Бен
источник

Ответы:

172

Вам нужно использовать "\n"not '\n'in your gsub. Различные кавычки ведут себя по-разному.

Двойные кавычки "допускают расширение символов и интерполяцию выражений, т.е. они позволяют использовать экранированные управляющие символы, например, \nдля представления их истинного значения, в данном случае новую строку , и позволяют использовать, #{expression}так что вы можете вплетать переменные и, ну, почти любое выражение рубина, которое вам нравится, в текст.

С другой стороны, одинарные кавычки 'трактуют строку буквально, поэтому нет расширения, замены, интерполяции или чего-то еще.

В этом конкретном случае лучше использовать метод .deleteили .trString для удаления новых строк .

Смотрите здесь для получения дополнительной информации

ocodo
источник
17
правильный синтаксис действительно был бы .gsub (/ \ n /, "")
boulder_ruby
2
@ Дэвид прав. Однако я чувствовал, что важно показать, что цитаты имеют значение, поскольку на данном этапе это принесет пользу Бену. Имейте в виду, Дэвид, вероятно, это больше вопрос стиля, чем «правильности». Лично я считаю, что trэто лучший выбор для этой задачи, но, как я уже сказал, я решил, что лучше указать разницу в одинарных и двойных кавычках, когда я отвечал.
ocodo
60

Если вы хотите удалить строку, а не заменить ее, вы можете использовать String#delete(или ее эквивалент-мутатор String#delete!), например:

x = "foo\nfoo"
x.delete!("\n")

x теперь равно "дурак"

В этом конкретном случае String#deleteон более читабелен, чем gsubпоскольку вы фактически ничем не заменяете строку.

Пол Лидер
источник
3
По крайней мере, в Ruby 1.9.3 не deleteявляется деструктивным, как указано здесь. Возвращает новую строку.
Брент Диллингем,
Хорошо подмечено. Я обновил этот фрагмент кода, чтобы использовать версию мутатора String # delete! а не String # delete
Пол Лидер
56

Если вы хотите или не возражаете против удаления всех начальных и конечных пробелов из вашей строки, вы можете использовать этот stripметод.

"    hello    ".strip   #=> "hello"   
"\tgoodbye\r\n".strip   #=> "goodbye"

как упоминалось здесь .

edit Первоначальный заголовок этого вопроса был другим. Отвечаю на исходный вопрос.

ThomasW
источник
2
Это не отвечает на вопрос. stripудаляет только начальные
thelostspore
1
@mvdanj Да, учитывая детали этого конкретного вопроса, он не отвечает на него, но отвечает на вопрос только на основе заголовка. Я подозреваю, что люди сочли это полезным.
ThomasW
Название было изменено с того момента, когда я первоначально ответил.
ThomasW
29

Для этого вам не нужно регулярное выражение. Используйте tr:

"some text\nandsomemore".tr("\n","")
Марк Томас
источник
в чем разница между tr и replace?
Арнольд Роа
replaceпросто меняет строку на новую, как присвоение переменной; тогда как trэто глобальный посимвольный поиск и замена.
Марк Томас
21

используйте функции chompили stripиз Ruby:

"abcd\n".chomp => "abcd"
"abcd\n".strip => "abcd"
Матео Видал
источник
2
Это не отвечает на вопрос. stripудаляет только начальные
thelostspore
2
chomp - лучший способ ... не могу поверить, что у него так меньше голосов
user1735921,
в методе chomp \ n и \ r удаляются из конца str, если они существуют, а не из середины. Так что это не решает вопрос OP
silva96