Ruby-Funktion zum Entfernen aller Leerzeichen?

573

Was ist die Ruby-Funktion, um alle Leerzeichen zu entfernen ? Ich suche so etwas wie PHPs trim()?

gpwu
quelle
36
Ihre Frage ist nicht klar: Möchten Sie alle Leerzeichen entfernen oder möchten Sie führende und nachfolgende Leerzeichen entfernen?
Sinan Ünür
25
PHPs trim()Strips Whitespace " vom Anfang und Ende eines Strings " (wie in der Dokumentation angegeben ) entfernt nicht "alle Whitespaces".
Tadeck
3
Im Zweifelsfall lesen Sie die Ruby-Online-Dokumentation für die String-Klasse (siehe .strip unten).
Merovex
2
Beachten Sie, dass bei allen Antworten, die verwendet String#stripoder abgeglichen /\s+/werden, nur ASCII-Leerzeichen entfernt werden. Wenn Sie sicherstellen möchten, dass auch Nicht-ASCII-Leerzeichen erfasst werden (z. B. HTML- &nbspCode), lesen Sie die seltsam unbeliebte Antwort von @EBooker.
MatzFan
1
Schade, dass solch großartige Antworten nicht die endgültige Würde eines Akzeptierten erreichen können
New Alexandria

Antworten:

846

Wenn Sie nur führende und nachfolgende Leerzeichen entfernen möchten (wie das Trimmen von PHP), können Sie diese verwenden .strip. Wenn Sie jedoch alle Leerzeichen entfernen möchten , können Sie .gsub(/\s+/, "")stattdessen verwenden.

joel.neely
quelle
5
Bedeutet "/ \ s + /" einfach Leerzeichen?
Rails Anfänger
54
\ s + bedeutet 1 oder mehr Leerzeichen (Leerzeichen, Zeilenumbruch, Tabulator). Die // Umgebung zeigt, dass es sich um einen regulären Ausdruck handelt.
Dylanfm
3
Dies ist nicht gleichbedeutend mit trim ()
Brett Holt
6
Strip war genau das, wonach ich gesucht habe, danke für die gute Frage und die Antwort!
Francois
15
@BrettHolt Der gsub-Ausdruck ist nicht dasselbe wie trim, aber der Fragesteller hat den Ausdruck "all whitespace" eingefügt, der auch nicht mit trim identisch ist. Also gab ich Alternativen.
Joel.neely
494
s = "I have white space".delete(' ')

Und um die PHP- trim()Funktion zu emulieren :

s = "   I have leading and trailing white space   ".strip
Ed S.
quelle
12
Dies ist viel besser lesbar als der reguläre Ausdruck. Warum ist es nicht so beliebt?
Karbass
89
@ckarbass: Weil viele Leute zu komplexe Lösungen für einfache Probleme bevorzugen. Es geht mit der Erfahrung weg.
Ed S.
97
@ckarbass @Ed S. Es ist nicht so beliebt, weil es nicht dasselbe ist. In der ursprünglichen Frage wurde der Ausdruck "Alle Leerzeichen" verwendet, der Tabulatoren, Zeilenumbrüche usw. enthält. Diese vorgeschlagene Antwort entfernt diese anderen Leerzeichen nicht. In Bezug auf "zu komplex" schlage ich vor, den einfachen regulären Ausdruck mit zu vergleichen .delete(' ').delete('\t').delete('\n') ..., der zu ausführlich ist und viele Möglichkeiten für Tippfehler und Auslassungsfehler bietet.
Joel.neely
13
@ joel.neely: Ich habe diese Frage vor langer Zeit beantwortet, aber die Frage noch einmal gelesen, diesmal genauer. Das OP fragte nach "einer Funktion zum Entfernen aller Leerzeichen" , fragte dann aber nach "so etwas wie PHPs trim ()" . Es ist also ein bisschen schwierig, genau zu wissen, was sie hier wollen. trim()entfernt sicherlich keine Zeilenumbrüche und andere Leerzeichen. Sie wählen eine Interpretation einer vagen Frage.
Ed S.
4
@ joel.neely: Das heißt, ich stimme zu, dass eine Lösung , die über die wörtliche Auslegung der Frage geht ein besseres in diesem Fall ist (dh eine regex alle Zeichen entfernt werden, die Leerzeichen anstatt einer Reihe von darstellen würde delete()Anrufe.)
Ed S.
163

Verwandte Antwort:

"   clean up my edges    ".strip

kehrt zurück

"clean up my edges"
jrhicks
quelle
Das habe ich vergessen. Ich wusste, dass es eine Methode zum Entfernen von Leerzeichen gibt, die dies standardmäßig tun würde, wenn keine Argumente übergeben würden. +1
Ed S.
Dies entspricht dem Trimmen. Bitte beachten Sie das obige Zitat von @Tadeck.
Brett Holt
3
Wenn die Möglichkeit besteht, dass die Variable vorhanden ist nil, müssen Sie die .to_sMethode ausführen , bevor Sie den Strip ausführen , damit die Strip-Methode keinen Fehler auslöst. Ex. str=nil; str.to_s.strip #=> ""
Scarver2
Ich bevorzuge some_data.strip! wenn some_data.is_a? String
slindsey3000
156

String#strip - Entfernen Sie alle Leerzeichen vom Anfang und vom Ende.

String#lstrip - Nur von Anfang an.

String#rstrip - Nur vom Ende.

String#chomp(ohne Argumente) - löscht Zeilentrennzeichen ( \noder \r\n) am Ende.

String#chop - löscht das letzte Zeichen.

String#delete- x.delete(" \t\r\n")- löscht alle aufgelisteten Leerzeichen.

String#gsub- x.gsub(/[[:space:]]/, '')- entfernt alle Leerzeichen, einschließlich Unicode- Leerzeichen .


Hinweis : Alle oben genannten Methoden geben eine neue Zeichenfolge zurück, anstatt das Original zu mutieren. Wenn Sie die Zeichenfolge an Ort und Stelle ändern möchten, rufen Sie !am Ende die entsprechende Methode mit auf.

ndnenkov
quelle
Das Beispiel zum Löschen von Zeichenfolgen # scheint einen regulären Ausdruck zu verwenden, steht jedoch \sin Anführungszeichen anstelle von Schrägstrichen. Außerdem konnte ich in der Dokumentation keine Erwähnung finden, dass das Löschen einen regulären Ausdruck als Argument verwenden kann.
Faultier
@slothbear, es ist kein regulärer Ausdruck, es ist eine kleine Reihe von Mustern, die regulären Ausdrucksformen ähneln. Wie für die Dokumentation #deletesoll ähnlich funktionieren #count. Sie können es auch in der Konsole versuchen.
ndnenkov
Danke, dass du mir etwas Neues beigebracht hast. Und auch danke für die Erinnerung, Dinge im kleinstmöglichen Kontext (Befehlszeile) auszuprobieren.
Faultier
1
@SeinopSys Ich wollte diese Antwort nur Ruby behalten.
ndnenkov
2
Nur das letzte Beispiel in dieser Antwort zeigt den gefürchteten ASCII 160 "Non-Breaking Space", den Fluch der Web-Scraper. #stripnicht. Siehe stackoverflow.com/questions/4859438/…
MatzFan
95
"1232 23 2 23 232 232".delete(' ')
=> "123223223232232"

Löschen funktioniert schneller =)

user         system     total      real
gsub, s      0.180000   0.010000   0.190000 (0.193014)
gsub, s+     0.200000   0.000000   0.200000 (0.196408)
gsub, space  0.220000   0.000000   0.220000 (0.222711)
gsub, join   0.200000   0.000000   0.200000 (0.193478)
delete       0.040000   0.000000   0.040000 (0.045157)
Rusllonrails
quelle
1
aber dies entfernt nur spaces, nicht allewhite spaces
Gavriel
1
delete(" \t\r\n")kümmert sich um typische Leerzeichen und ist immer noch schneller als gsub.
Seth Jeffery
94

Wenn Sie Rails / ActiveSupport verwenden , können Sie die squishMethode verwenden. Es entfernt Leerzeichen an beiden Enden der Zeichenfolge und gruppiert mehrere Leerzeichen zu einem einzelnen Leerzeichen.

Zum Beispiel.

" a  b  c ".squish

ergibt sich zu:

"a b c"

Überprüfen Sie diese Referenz von api.rubyonrails.org .

Radhika
quelle
4
Beachten Sie, dass von Antworten nur auf Links abgeraten wird. SO-Antworten sollten der Endpunkt einer Suche nach einer Lösung sein (im Gegensatz zu einem weiteren Zwischenstopp von Referenzen, die im Laufe der Zeit veralten). Bitte fügen Sie hier eine eigenständige Zusammenfassung hinzu, wobei Sie den Link als Referenz behalten.
Kleopatra
2
Ich denke, diese Antwort war ausreichend erklärt und die Tatsache, dass der Link Referenz war, da die Antwort selbst klar erklärt wurde. Diese Funktion war gut, danke
ksugiarto
4
Dies ist von ActiveSupport. Sie brauchen nicht alle Rails, um es zu benutzen, aber Sie brauchen mindestens ActiveSupport und einerequire 'active_support/core_ext/string/filters'
Justin Force
2
Dies ist ein Leerzeichen. ZB"a \t \n \f \r \v b".squish == "a b"
Purplejacket
47

Es ist ein bisschen spät, aber jeder andere, der diese Seite googelt, könnte an dieser Version interessiert sein -

Wenn Sie einen Teil des vorformatierten Textes bereinigen möchten, den ein Benutzer möglicherweise irgendwie ausgeschnitten und in Ihre App eingefügt hat, aber den Wortabstand beibehalten möchten, versuchen Sie Folgendes:

content = "      a big nasty          chunk of     something

that's been pasted                        from a webpage       or something        and looks 

like      this

"

content.gsub(/\s+/, " ").strip

#=> "a big nasty chunk of something that's been pasted from a webpage or something and looks like this"
Jules Copeland
quelle
33
Man könnte auch die squishMethode von Rails verwenden: apidock.com/rails/String/squish
Phillip Koebbe
5
Oder wenn Sie keine Rails und keine Zeilenumbrüche haben, funktioniert dies squeeze(" ")möglicherweise.
Andrew Grimm
45

Rubys .stripMethode führt das PHP-Äquivalent zu aus trim().

So entfernen Sie alle Leerzeichen:

"  leading    trailing   ".squeeze(' ').strip
=> "leading trailing"

@Tass hat mich darauf aufmerksam gemacht, dass meine ursprüngliche Antwort doppelte Buchstaben nacheinander entfernt - YUCK! Ich habe seitdem auf die Squish-Methode umgestellt, die bei Verwendung des Rails-Frameworks bei solchen Ereignissen intelligenter ist.

require 'active_support/all'
"  leading    trailing   ".squish
=> "leading trailing"

"  good    men   ".squish
=> "good men"

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

scarver2
quelle
1
Dadurch werden "verbundene" doppelte Zeichen entfernt. "good men".squeeze.stripwird zurückkehren"god men"
Tass
1
Vielen Dank für den Hinweis auf @Tass. Ich habe meine Antwort zugunsten der Squish-Methode bearbeitet.
scarver2
1
+1 für "doppelte Buchstaben nacheinander". Ich konnte mir keine Möglichkeit vorstellen, das Szenario zu beschreiben. Gut gemacht! :-)
Tass
26
" Raheem Shaik ".strip

Es werden linke und rechte Seitenräume entfernt. Dieser Code würde uns geben:"Raheem Shaik"

Kumpel
quelle
20

Vergessen Sie auch nicht:

$ s = "   I have white space   ".split
=> ["I", "have", "white", "space"]
Justicle
quelle
6
Also wird s.split.join den Job machen.
Piotr Brudny
1
Das ist schön beim Iterieren:[" Hello World", "Big Giraffe "].map(&:split).map(&:join) #=> ["HelloWorld", "BigGiraffe"]
Tbloncar
20

split.join wird alle Leerzeichen irgendwo in der Zeichenfolge sprengen.

"  a b  c    d     ".split.join
> "abcd"

Es ist einfach zu tippen und sich zu erinnern, daher ist es schön auf der Konsole und für schnelles Hacken. In seriösem Code wohl nicht willkommen, da er die Absicht maskiert.

(Basierend auf Piotrs Kommentar in Justicles Antwort oben.)

Mahemoff
quelle
1
Vielen, vielen Dank für diesen Kommentar :-) Dies ist die einzige Methode, die funktioniert, wenn Sie eine lange Zeichenfolge haben, die wie ein Absatz aussieht.
Boomerange
12

Sie könnten dies versuchen

"Some Special Text Values".gsub(/[[:space:]]+/, "")

using : space: Entfernt nicht unterbrechendes Leerzeichen zusammen mit dem regulären Leerzeichen.

EBooker
quelle
1
Dies ist meiner Meinung nach die beste Antwort, da im wilden HTML &nbspund in anderen Nicht-ASCII-Leerzeichen keine Leerzeichen entfernt String#stripoder von diesen abgeglichen werden /\s/. Siehe den Abschnitt "POSIX-Klammerausdrücke" in den Regexp-Dokumenten
MatzFan
8

Verwenden Sie gsub oder löschen Sie. Der Unterschied ist, dass gsub Tabs entfernen kann, während Löschen dies nicht kann. Manchmal haben Sie Registerkarten in Dateien, die von den Editoren hinzugefügt werden.

a = "\tI have some whitespaces.\t"
a.gsub!(/\s/, '')  #=>  "Ihavesomewhitespaces."
a.gsub!(/ /, '')   #=>  "\tIhavesomewhitespaces.\t"
a.delete!(" ")     #=>  "\tIhavesomewhitespaces.\t"
a.delete!("/\s/")  #=>  "\tIhavesomewhitespaces.\t"
a.delete!('/\s/')  #=>  using single quote is unexpected, and you'll get "\tI have ome whitepace.\t"
Eukken
quelle
8

Es gibt viele Möglichkeiten:
Leerzeichen von beiden Seiten entfernen:

Ein bisschen wie PHPs Trim ()

Foo_bar.strip

So entfernen Sie alle Leerzeichen:

Foo_bar.gsub(/ /, "")

So entfernen Sie alle Leerzeichen:

Foo_bar.gsub(/\s/, "")
Sapphire_Brick
quelle
6
"asd sda sda sd".gsub(' ', '')
=> "asdsdasdasd"
edikgat
quelle
aber dies entfernt nur spaces, nicht allewhite spaces
Gavriel
6

Die gsub-Methode reicht völlig aus.
Die gsub-Methode kann für eine Zeichenfolge aufgerufen werden und lautet:

a = "this is a string"
a = a.gsub(" ","")
puts a
#Output: thisisastring

Die gsub-Methode sucht nach jedem Vorkommen des ersten Arguments und ersetzt es durch das zweite Argument. In diesem Fall wird jedes Leerzeichen in der Zeichenfolge ersetzt und entfernt.

Ein anderes Beispiel:

b = "the white fox has a torn tail"

Ersetzen wir jedes Vorkommen des Buchstabens "t" durch ein Großbuchstaben "T".

b = b.gsub("t","T")
puts b 
#Output: The whiTe fox has a Torn Tail
bdbasinger
quelle
5

Für ein Verhalten, das genau mit PHP übereinstimmt trim, ist die einfachste Methode, die String#stripMethode wie folgt zu verwenden :

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
new_string = string.strip
puts "Updated  [#{new_string}]:#{new_string.length}"

Ruby hat auch eine Edit-in-Place-Version namens String.strip!(beachten Sie das nachfolgende '!'). Dies erfordert keine Erstellung einer Kopie der Zeichenfolge und kann für einige Verwendungszwecke erheblich schneller sein:

string = "  Many have tried; many have failed!    "
puts "Original [#{string}]:#{string.length}"
string.strip!
puts "Updated  [#{string}]:#{string.length}"

Beide Versionen erzeugen diese Ausgabe:

Original [  Many have tried; many have failed!    ]:40
Updated  [Many have tried; many have failed!]:34

Ich habe einen Benchmark erstellt, um die Leistung einiger grundlegender Anwendungen von stripund strip!sowie einiger Alternativen zu testen . Der Test ist folgender:

require 'benchmark'

string = 'asdfghjkl'
Times = 25_000

a = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
b = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
c = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }
d = Times.times.map {|n| spaces = ' ' * (1+n/4); "#{spaces}#{spaces}#{string}#{spaces}" }

puts RUBY_DESCRIPTION
puts "============================================================"
puts "Running tests for trimming strings"

Benchmark.bm(20) do |x|
  x.report("s.strip:")                 { a.each {|s| s = s.strip } }
  x.report("s.rstrip.lstrip:")         { a.each {|s| s = s.rstrip.lstrip } }
  x.report("s.gsub:")                  { a.each {|s| s = s.gsub(/^\s+|\s+$/, "") } }
  x.report("s.sub.sub:")               { a.each {|s| s = s.sub(/^\s+/, "").sub(/\s+$/, "") } }

  x.report("s.strip!")                 { a.each {|s| s.strip! } }
  x.report("s.rstrip!.lstrip!:")       { b.each {|s| s.rstrip! ; s.lstrip! } }
  x.report("s.gsub!:")                 { c.each {|s| s.gsub!(/^\s+|\s+$/, "") } }
  x.report("s.sub!.sub!:")             { d.each {|s| s.sub!(/^\s+/, "") ; s.sub!(/\s+$/, "") } }
end

Dies sind die Ergebnisse:

ruby 2.2.5p319 (2016-04-26 revision 54774) [x86_64-darwin14]
============================================================
Running tests for trimming strings
                           user     system      total        real
s.strip:               2.690000   0.320000   3.010000 (  4.048079)
s.rstrip.lstrip:       2.790000   0.060000   2.850000 (  3.110281)
s.gsub:               13.060000   5.800000  18.860000 ( 19.264533)
s.sub.sub:             9.880000   4.910000  14.790000 ( 14.945006)
s.strip!               2.750000   0.080000   2.830000 (  2.960402)
s.rstrip!.lstrip!:     2.670000   0.320000   2.990000 (  3.221094)
s.gsub!:              13.410000   6.490000  19.900000 ( 20.392547)
s.sub!.sub!:          10.260000   5.680000  15.940000 ( 16.411131)
Michael Gaskill
quelle
3

Meine persönliche Präferenz ist die Verwendung der Methode .tr

wie in:

string = "this is a string to smash together"

string.tr(' ', '') # => "thisisastringtosmashtogether"

Vielen Dank an @FrankScmitt für den Hinweis, dass Sie zum Löschen aller Leerzeichen (nicht nur Leerzeichen) Folgendes schreiben müssen:

string = "this is a string with tabs\t and a \nnewline"

string.tr(" \n\t", '') # => "thisisastringwithtabsandanewline"
Jeremy Gunter
quelle
aber dies entfernt nur spacesnichtall white spaces
Gavriel
Verwenden Sie s.tr(" \t\n", '')stattdessen alle Leerzeichen (Leerzeichen, Tabulator, Zeilenumbruch) .
Frank Schmitt
@ Gavriel - Ich habe die Frage falsch verstanden, ich danke Ihnen, dass Sie darauf hingewiesen haben.
Jeremy Gunter
@FrankSchmitt Ich habe Ihre Antwort zu meiner Antwort hinzugefügt, um die Frage des OP besser beantworten zu können. Danke, dass du mich korrigiert hast.
Jeremy Gunter
3

Ich habe versucht, dies zu tun, da ich einen Datensatz- "Titel" als ID in der Ansicht verwenden wollte, aber die Titel Leerzeichen hatten.

Eine Lösung ist:

record.value.delete(' ') # Foo Bar -> FooBar
Brad
quelle
1

Rubys .scan()und .join()String-Methoden können auch dazu beitragen, Leerzeichen in Strings zu überwinden.

scan(/\w+/).join entfernt alle Leerzeichen und verbindet die Zeichenfolge

string = "White spaces in me".scan(/\w+/).join
=>"Whitespacesinme"

Außerdem wird Leerzeichen vom linken und rechten Teil der Zeichenfolge entfernt. Mittel ltrim, rtrimund trim. Nur für den Fall, dass jemand Hintergrundinformationen Chat FoxProoder Visual Basiceinspringt Ruby.

2.1.6 :002 > string = " White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :003 > string = " White spaces in me".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :004 > string = "White spaces in me ".scan(/\w+/).join => "Whitespacesinme" 2.1.6 :005 >

Dharmesh Rupani
quelle
1
@AmitPandya Vielen Dank, dass Sie auf zusätzliche wichtige Punkte der .scan () -Methode hingewiesen haben. Geschätzt !!!
Dharmesh Rupani
1

Ich würde so etwas verwenden:

my_string = "Foo bar\nbaz quux"

my_string.split.join
=> "Foobarbazquux"
Artur Okoński
quelle
geradeaus. Danke
Srikanth Peetha
1

Ich bin etwas spät dran, aber ich entferne nachfolgende und führende Leerzeichen mit strip!. Wenn Sie ein Array haben, wie ich es getan habe, musste ich das Array durchlaufen und es nach dem Ende der Instanz speichern. Das ! hat sich darum gekümmert. Dadurch wurden alle Leerzeichen am Ende oder am Anfang entfernt, nicht nur das erste führende oder das letzte nachfolgende.

Zum Beispiel:

array = ["hello ","   Melanie", "is", " new ", "to  ", " programming"]
array.each do |i|
  i.strip!
end

Dies würde ausgegeben werden zu: ["Hallo", "Melanie", "ist", "neu", "zu", "Programmierung"]. Ich habe dies in einem Video weiter untersucht / geteilt, das ich gemacht habe, um diesen Code für ähnliche Fragen hervorzuheben, die ich hatte .

Ich bin neu in der Programmierung und die Verwendung von Strip hat nicht funktioniert, da es nach dem Ende der Schleife nicht im Array gespeichert wurde.

Melanie
quelle
0

Sie können dies versuchen:

"ab c d efg hi ".split.map(&:strip)

um dies zu bekommen:

["ab, "c", "d", "efg", "hi"]

oder wenn Sie eine einzelne Zeichenfolge möchten, verwenden Sie einfach:

"ab c d efg hi ".split.join
LvcasX1
quelle