2015-05-14 16 views

Antwort

23

können Sie so etwas wie verwenden:

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

Oder, wenn Sie die geänderte Zeichenfolge zurückgeben möchten, anstatt die Variable modifizieren,

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

Dies wird auch Sie es mit anderen Kette Methoden (z. B. something_else = var_name.gsub(...).to_i, um das Leerzeichen zu entfernen, dann wandeln Sie es in eine Ganzzahl um). gsub! wird es an Ort und Stelle bearbeiten, so müssten Sie var_name.gsub!(...); something_else = var_name.to_i schreiben. Streng genommen, solange mindestens eine Änderung vorgenommen wird, gibt gsub! die neue Version zurück (dh dasselbe würde gsub zurückgeben), aber wenn Sie eine Zeichenfolge ohne Leerzeichen erhalten, wird nil zurückgegeben und die Dinge werden brechen. Aus diesem Grund würde ich gsub bevorzugen, wenn Sie Methoden verketten.

gsub funktioniert, indem alle Übereinstimmungen des ersten Arguments mit dem zweiten Argument des Inhalts ersetzt werden. In diesem Fall wird eine beliebige Folge aufeinanderfolgender Leerzeichen (oder nur eine einzige) mit der Regex /\s+/ abgeglichen und dann durch eine leere Zeichenfolge ersetzt. Es gibt auch eine Blockform, wenn Sie eine Bearbeitung für den angepassten Teil durchführen möchten, anstatt nur direkt zu ersetzen; Weitere Informationen hierzu finden Sie unter String#gsub.

Die Ruby-Dokumentation für die Klasse Regexp ist ein guter Ausgangspunkt, um mehr über reguläre Ausdrücke zu erfahren - ich habe festgestellt, dass sie in einer Vielzahl von Situationen nützlich sind, in denen es einige Millisekunden nicht gibt zählen, und Sie müssen keine Dinge zuordnen, die beliebig tief verschachtelt werden können.

Wie Gene vorgeschlagen in seinem Kommentar, können Sie auch tr verwenden:

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

Es funktioniert auf ähnliche Art und Weise, sondern einen regulären Ausdruck zu ersetzen, ersetzt es jede Instanz des n th Charakter das erste Argument in der Zeichenfolge, die es mit dem n ten Zeichen des zweiten Parameters aufgerufen wird, oder falls nicht, mit nichts. Weitere Informationen finden Sie unter String#tr.

1

Alternativ können Sie die Zeichenfolge für die Ziffern scan/\d+/ und join das Ergebnis:

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

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

Bitte beachten Sie, dass dies auch alphabetische Zeichen, Bindestriche, Symbole entfernen, im Grunde alles, was keine Ziffer ist.

+0

Ich möchte darauf hinweisen, dass dies Am Ende verwenden Sie ziemlich viel Speicher, wenn Sie eine sehr lange Liste von Zahlen haben, aus denen Whitespace entfernt werden soll, da zuerst ein Array jedes Vorkommens erstellt werden muss, zu dem es dann hinzugefügt wird. Ich denke, es ist auch ein bisschen langsamer, da es zweimal durchläuft, obwohl ich nichts davon weiß. –

4

Sie könnten auch String#delete verwenden:

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

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

Sie String#delete!str in Position zu ändern verwenden könnte, aber beachten Sie delete! kehrt nil, wenn keine Änderung vorgenommen wird

+0

@ndn, guter Vorschlag. Vielen Dank. (Leser: Ich hatte früher 'srr.tr" \ s \ n "," ".) –

Verwandte Themen