2015-05-14 27 views

Odpowiedz

23

Można użyć coś takiego:

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

Albo, jeśli chcesz wrócić zmieniony ciąg, zamiast modyfikowania zmiennej

var_name.gsub(/\s+/, '') 

ta pozwala także łańcuchowych z innymi metody (tj. something_else = var_name.gsub(...).to_i, aby usunąć białe znaki, a następnie przekonwertować je na liczbę całkowitą). gsub! dokona edycji w miejscu, więc musisz napisać var_name.gsub!(...); something_else = var_name.to_i. Ściśle mówiąc, dopóki zostanie wprowadzona co najmniej jedna zmiana, gsub! zwróci nową wersję (tzn. Powróci ta sama nazwa: gsub), ale przy okazji, że otrzymujesz ciąg bez spacji, zwróci on nil i wszystko się zepsuje. Z tego powodu wolałbym gsub, jeśli używasz metod.

gsub działa, zastępując wszelkie dopasowania pierwszego argumentu z drugim argumentem zawartości. W tym przypadku pasuje do dowolnej sekwencji kolejnych znaków białych znaków (lub tylko jednego) do regex /\s+/, a następnie zastępuje je pustym łańcuchem. Istnieje również blokowa forma, jeśli chcesz wykonać pewne przetwarzanie na dopasowanej części, zamiast tylko zastępować bezpośrednio; zobacz String#gsub, aby uzyskać więcej informacji na ten temat.

Dokumenty Ruby dla klasy Regexp stanowią dobry punkt wyjścia do poznania wyrażenia regularnego - stwierdziłem, że są przydatne w wielu różnych sytuacjach, gdy kilka lub kilka milisekund tu i tam nie liczyć i nie trzeba dopasowywać rzeczy, które mogą być zagnieżdżane dowolnie głęboko.

Jak Gene sugerował w swoim komentarzu, można również użyć tr:

var_name.tr(" \t\r\n", '') 

To działa w podobny sposób, ale zamiast zastąpienia regex, zastępuje każdą instancję n th charakteru pierwszy argument w łańcuchu, do którego jest wywoływany, z postacią drugiego parametru lub, jeśli nie ma, bez niczego. Aby uzyskać więcej informacji, patrz String#tr.

1

Ewentualnie można scan ciąg cyfr dla /\d+/ i join Rezultat:

string = "123\n\n12312313\n\n123 1231 1231 1\n" 

string.scan(/\d+/).join 
#=> "12312312313123123112311" 

Należy pamiętać, że to również usunięcie znaków alfabetycznych, kreski, symbole, w zasadzie wszystko, co nie jest cyfrą.

+0

Chciałbym podkreślić, że jest to możliwe w końcu używa całkiem sporej ilości pamięci, jeśli masz bardzo długą listę liczb do usunięcia białych znaków, ponieważ najpierw trzeba zbudować tablicę każdego wystąpienia, które następnie łączy. Myślę, że jest też nieco wolniejszy, ponieważ iteruje dwa razy, choć nie wiem o tym. –

4

Można też użyć String#delete:

str = "123\n12312313\n\n123 1231 1231 1" 

str.delete "\s\n" 
    #=> "12312312313123123112311" 

Można użyć String#delete! zmodyfikować str na miejscu, ale należy pamiętać, delete! Przywraca nil jeśli żadna zmiana jest wykonana

+0

@Na dobry pomysł. Dzięki. (Czytelnicy: poprzednio miałem 'srr.tr" \ s \ n "," ".") –

Powiązane problemy