Jak mogę usunąć ciąg „\ n” z łańcucha Rubiego?


115

Mam ten ciąg:

"some text\nandsomemore"

Muszę usunąć z niego znak „\ n”. próbowałem

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

ale to nie działa. Jak mam to zrobić? Dziękuje za przeczytanie.

Odpowiedzi:


172

Musisz używać "\n"nie '\n'w swoim gsub. Różne cudzysłowy zachowują się inaczej.

Podwójne cudzysłowy "umożliwiają interpretację znaków i interpolację wyrażeń, np. pozwalają ci używać znaków sterujących uciekających, takich jak \nreprezentowanie ich prawdziwej wartości, w tym przypadku, nowej linii , i pozwalają na użycie, #{expression}dzięki czemu możesz wplatać zmienne i, cóż, prawie każde wyrażenie ruby, które lubisz w tekście.

Z drugiej strony, pojedyncze cudzysłowy 'traktują ciąg dosłownie, więc nie ma tu żadnej interpretacji, zamiany, interpolacji ani tego, co masz.

W tym konkretnym przypadku do usunięcia nowych linii lepiej jest użyć metody .deletelub .trString .

Więcej informacji znajdziesz tutaj


17
właściwa składnia to naprawdę .gsub (/ \ n /, "")
boulder_ruby

2
@David ma rację. Jednak czułem, że ważne jest, aby pokazać, że cytaty mają znaczenie, ponieważ w tym momencie przyniesie to korzyści Benowi. Pamiętaj, Davidzie, to prawdopodobnie bardziej kwestia stylu niż „poprawności”. Osobiście uważam, że trjest to lepszy wybór do tego zadania, ale jak mówię, pomyślałem, że lepiej będzie wskazać różnicę w pojedynczych, podwójnych cudzysłowach, kiedy odpowiadam.
ocodo

60

Jeśli chcesz usunąć ciąg, zamiast go zastępować, możesz użyć String#delete(lub jego odpowiednika mutatora String#delete!), np .:

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

x teraz równa się „foofoo”

W tym konkretnym przypadku String#deletejest bardziej czytelny, niż gsubponieważ w rzeczywistości nie zastępujesz łańcucha niczym.


3
Przynajmniej w Rubim 1.9.3 deletenie jest destrukcyjny, jak wskazano tutaj. Zwraca nowy ciąg.
Brent Dillingham

Dobrze zauważony. Zaktualizowałem ten fragment kodu, aby używał wersji mutatora String # delete! zamiast String # delete
Paul Leader

56

Jeśli chcesz lub nie masz nic przeciwko usunięciu wszystkich początkowych i końcowych białych znaków z ciągu, możesz użyć tej stripmetody.

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

jak wspomniano tutaj .

edytuj Oryginalny tytuł tego pytania był inny. Moja odpowiedź dotyczy pierwotnego pytania.


2
To nie odpowiada na pytanie. stripusuwa tylko początkowe
thelostspore

1
@mvdanj Tak, biorąc pod uwagę szczegóły tego konkretnego pytania, nie odpowiada na nie, ale odpowiada na pytanie tylko na podstawie tytułu. Podejrzewam, że właśnie dlatego ludzie uznali to za przydatne.
Thomas W,

Tytuł został zmieniony od czasu, gdy pierwotnie odpowiedziałem.
Thomas W,

29

Nie potrzebujesz do tego wyrażenia regularnego. Użyj tr:

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

jaka jest różnica między tr an replace?
Arnold Roa

replacepo prostu zmienia ciąg na nowy, jak przypisanie zmiennej; mając na uwadze, że trjest to globalne wyszukiwanie i zastępowanie znak po znaku.
Mark Thomas,

21

użycie chomplub stripfunkcje z Rubiego:

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

2
To nie odpowiada na pytanie. stripusuwa tylko początkowe
thelostspore

2
Chomp to najlepszy sposób ... nie mogę uwierzyć, że to ma tak mniej pozytywnych głosów
user1735921

w metodzie chomp \ n i \ r są usuwane z końca str, jeśli istnieją, a nie w środku. Więc to nie rozwiązuje pytania OP
silva96

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.