Wie kann man alle Leerzeichen sicher durch Unterstriche durch Rubin ersetzen?

70

Dies funktioniert für alle Zeichenfolgen, die Leerzeichen enthalten

str.downcase.tr!(" ", "_")

Zeichenfolgen, die keine Leerzeichen enthalten, werden jedoch einfach gelöscht

"New School" würde sich also in "new_school" ändern, aber "color" wäre "", nichts!

Rugbert
quelle
2
Nimm mein Wort nicht dafür, aber ich denke es iststr.gsub! /\s/, '_'

Antworten:

41

Die Dokumente für tr! sagen

Übersetzt str an Ort und Stelle nach den gleichen Regeln wie String # tr. Gibt str oder nil zurück, wenn keine Änderungen vorgenommen wurden.

Ich denke, Sie erhalten die richtigen Ergebnisse, wenn Sie tr ohne Ausrufezeichen verwenden.

rwilliams
quelle
In der Tat !ändert sich, was auch immer es nennt, während es ohne das !eine neue Zeichenfolge
zurückgibt
111

mit Raum

str = "New School"
str.parameterize.underscore

=> "new_school"

ohne Platz

str = "school"
str.parameterize.underscore

=> "school"

Bearbeiten: - Wir können auch '_' als Parameter zur Parametrisierung übergeben.

mit Raum

str = "New School"
str.parameterize('_')

=> "new_school"

ohne Platz

str = "school"
str.parameterize('_')

=> "school"

EDIT :

Verwenden Sie für Schienen 5 und höher str.parameterize(separator: '_')

Sampat Badhe
quelle
4
Achtung. parameterizekonvertiert mehr als Leerzeichen - viele Sonderzeichen werden ebenfalls konvertiert. Die Absicht von parameterizeist es, eine Zeichenfolge URL-freundlich zu machen.
Mark Thomas
4
Seien Sie vorsichtig, da es String#parameterizein Ruby keine gibt . Es gibt jedoch String#parameterizein Rails.
dskecse
4
Und parametrieren braucht kein Argument mehr.
Stephenmurdoch
1
Verwenden Sie auf Schienen 5 str.parameterize(separator: '_').
BrunoFacca
37

Wenn Sie daran interessiert sind, eine Zeichenfolge im Fall einer Schlange zu erhalten , funktioniert die vorgeschlagene Lösung nicht ganz, da Sie möglicherweise verkettete Unterstriche und beginnende / nachfolgende Unterstriche erhalten.

Zum Beispiel

1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :011 > str.downcase.tr(" ", "_")
  => "__john___smith_beer_"

Diese Lösung unten würde besser funktionieren:

1.9.3-p0 :010 > str= "  John   Smith Beer "
  => "  John   Smith Beer " 
1.9.3-p0 :012 > str.squish.downcase.tr(" ","_")
  => "john_smith_beer" 

Squish ist eine von Rails bereitgestellte String-Methode

Zack Xu
quelle
4
Ich str.downcase.split.join('_')denke, es könnte auch funktionieren, wenn #squish nicht verfügbar ist;)
vidbina
14

Wenn Sie Schienen 5 und höher verwenden, können Sie dasselbe mit erreichen

str.parameterize(separator: '_')
der Terminalguy
quelle
8
str.downcase.tr(" ", "_")

Hinweis: Nein "!"

Michael Durrant
quelle
8

Alte Frage, aber ...

Für alle Leerzeichen möchten Sie wahrscheinlich mehr davon:

"hey\t there   world".gsub(/\s+/, '_') # hey_there_world

Dies erhält Tabulatoren und neue Zeilen sowie Leerzeichen und wird durch eine einzelne ersetzt _.

Der Regex kann an Ihre Bedürfnisse angepasst werden. Z.B:

"hey\t there   world".gsub(/\s/, '_') # hey__there___world
br3nt
quelle
2
str = "Foo Bar"
str.tr(' ','').underscore

=> "foo_bar"
Ausflug
quelle
1

Sie können auch str.gsub ("", "_") ausführen.

zufälliger Benutzer
quelle