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!


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.


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: '_')


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


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: '_')


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

2
str = "Foo Bar"
str.tr(' ','').underscore

=> "foo_bar"

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.