Usuń wiele spacji i nowych linii wewnątrz ciągu

104

Załóżmy, że mamy taki ciąg:

Hello, my\n       name is Michael.

Jak mogę usunąć tę nową linię i rozdzielić te spacje po niej do jednego wewnątrz ciągu, aby to uzyskać?

Hello, my name is Michael.
Kreeki
źródło

Odpowiedzi:

188

sprawdź squishmetodę Railsów :

http://apidock.com/rails/String/squish

socjopata
źródło
6
Najprostsze i najbardziej eleganckie rozwiązanie. Dzięki. Ale jest jedna rzecz, ta metoda jest zdefiniowana w Railsach, więc będzie działać tylko w aplikacjach Railsowych, na szczęście tak jest w moim przypadku.
Kreeki
4
Jak powiedział Kreeki nieco niejasno, jest to metoda Railsów, a nie metoda Ruby.
17
W kontekście innym niż Rails, użyj some_string.strip.gsub(/\s+/, " ")dokładnie tego, co robi squish.
rapcal,
1
Dziękuję Ci! Nie wiedziałem osquish
Francois
38

Aby zilustrować wbudowany w squeeze Rubys :

string.gsub("\n", ' ').squeeze(' ')
steenslag
źródło
3
Po prostu bądź świadomy: squeeze skompresuje WSZYSTKIE ciągi, które występują w ciągach wielu znaków. Więc „Squeeze my application's copy” .squeeze => „Squeze my application's copy”
charliepark
8
Ale squeeze(' ')po prostu ściska spacje. "Squeeze my application's copy".squeeze(' ') => "Squeeze my application's copy".
steenslag
22

Prawdopodobnie najprostszy sposób

s = "Hello, my\n       name is Michael."
s.split.join(' ') #=> "Hello, my name is Michael."
Koraktor
źródło
8

Spróbuj tego:

s = "Hello, my\n       name is Michael."
s.gsub(/\n\s+/, " ")
anusha
źródło
W rzeczywistości jest to najlepsza odpowiedź typu „zwykły rubinowy” i działa poprawnie przy usuwaniu spacji wiodących z ciągu wielowierszowego.
Koen.
5
my_string = "Hello, my\n       name is Michael."
my_string = my_string.gsub( /\s+/, " " )
fl00r
źródło
chciałby również usunąć \nidealnie (czuję), że należy go zastąpić spacją w przypadku czegoś takiego jak"Hello,\nMy name is Michael"
Ali
4

to wyrażenie regularne zastąpi wystąpienie 1 lub więcej białych spacji 1 białą spacją, ps \szastąpi wszystkie białe znaki, które obejmują \s\t\r\n\f:

a_string.gsub!(/\s+/, ' ')

Podobnie tylko dla powrotu karetki

str.gsub!(/\n/, " ")

Najpierw zamień wszystko na \nbiałe spacje, a następnie użyj wyrażenia regularnego usuń wiele białych znaków.

Ali
źródło
Dzięki! To działało dla moich celów, aby usunąć wielokrotne spacje, ale zachować pojedynczą przestrzeń między słowami.
acoustic_north
3

Użyj ciągu # gsub :

s = "Hello, my\n       name is Michael."
s.gsub(/\s+/, " ")
Nikola
źródło
dane wyjściowe nie byłyby poprawne w przypadku "Hello,\nMy name is Michael". Idealnie byłoby, gdybyś chciał mieć przestrzeń, w której jest\n
Ali
1
Use squish
currency = " XCD"
str = currency.squish
 str = "XCD" #=> "XCD"
vikas pal
źródło