Як я можу видалити рядок "\ n" з рядка Ruby?


115

У мене є цей рядок:

"some text\nandsomemore"

Мені потрібно видалити "\ n" з нього. Я намагався

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

але це не працює. Як це зробити? Дякуємо за прочитане

Відповіді:


172

Використовувати потрібно "\n"не '\n'у своєму gsub. Різні лапки ведуть себе по-різному.

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

З іншого боку, одинарні цитати 'трактують рядок буквально, тому немає розширення, заміни, інтерполяції чи того, що у вас є.

В даному конкретному випадку, це краще використовувати або .deleteчи .trметод String , щоб видалити символ нового рядка .

Дивіться тут для отримання додаткової інформації


17
правильним синтаксисом справді буде .gsub (/ \ n /, "")
boulder_ruby

2
@David правильний. Однак я вважав, що важливо показати, що котирування мають значення, оскільки це принесло б користь Бену на даний момент. Зверніть увагу, Девід, це, мабуть, більше питання стилю, ніж "правильного". Особисто я вважаю trкращим вибором для цього завдання, але, як я кажу, я вважав, що краще вказати на різницю в одинарних, подвійних лапках, коли я відповідав.
ocodo

60

Коли ви хочете видалити рядок, а не замінити її, ви можете використовувати String#delete(або її мутаторний еквівалент String#delete!), наприклад:

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

x тепер дорівнює "foofoo"

У цьому конкретному випадку String#deleteчитабельніше, ніж gsubоскільки ви фактично не замінюєте рядок нічим.


3
Щонайменше, у Ruby 1.9.3 не deleteє руйнівним, як зазначено тут. Він повертає новий рядок.
Брент Діллінгем

Добре помічений. Я оновив цей фрагмент коду, щоб використовувати мутаторну версію String # delete! а не String # delete
Павло Ведучий

56

Якщо ви хочете чи не заперечуєте, щоб видалити всі провідні та кінцеві пробіли з рядка, ви можете скористатися stripметодом.

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

як згадується тут .

редагувати Оригінальна назва цього питання була іншою. Моя відповідь - за оригінальне запитання.


2
Це не дає відповіді на запитання. stripвидаляє лише пробіли та пробіли: ruby-doc.org/core-1.9.3/String.html#method-i-strip-21
thelostspore

1
@mvdanj Так. Враховуючи деталі цього конкретного питання, він не відповідає на нього, але відповідає на питання просто на основі назви. Я підозрюю, що саме тому люди вважають це корисним.
ThomasW

Назва була змінена з моменту, коли я спочатку відповів.
ThomasW

29

Для цього вам не потрібен регулярний вираз. Використовуйте tr:

"some text\nandsomemore".tr("\n","")

яка різниця між tr a заміною?
Арнольд Роа

replaceпросто змінює рядок на новий, як присвоєння змінної; тоді як trглобальна знахідка та заміна для персонажа.
Марк Томас

19

використання chompабо stripфункції від Ruby:

"abcd\n".chomp => "abcd"
"abcd\n".strip => "abcd"

2
Це не дає відповіді на запитання. stripвидаляє лише пробіли та пробіли - ruby-doc.org/core-1.9.3/String.html#method-i-strip-21
thelostspore

2
chomp - це найкращий спосіб ... не можу повірити, що це так менше результатів
користувач1735921

у методі chomp \ n та \ r видаляються з кінця str, якщо вони існують, а не посередині. Тож це не вирішує питання щодо ОП
silva96

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.