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


115

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

"some text\nandsomemore"

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

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

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

Ответы:


172

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

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

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

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

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


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 Первоначальный заголовок этого вопроса был другим. Отвечаю на исходный вопрос.


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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.