Ich versuche, eine aus Großbuchstaben bestehende Zeichenfolge in Ruby in eine Kleinbuchstabe umzuwandeln, wobei das erste Zeichen jedes Wortes jedoch Großbuchstaben ist. Beispiel:
konvertieren Sie "MY STRING HERE" in "My String Here".
Ich weiß, dass ich die .downcase-Methode verwenden kann, aber das würde alles klein machen ("mein String hier"). Ich scanne alle Zeilen in einer Datei und nimmt diese Änderung vor. Gibt es einen regulären Ausdruck, den ich mit Ruby verwenden kann, um dies zu erreichen?
Vielen Dank!
Als ich versuchte, meine eigene Methode zu entwickeln (unten als Referenz angegeben), stellte ich fest, dass es einige recht unangenehme Eckfälle gibt. Verwenden Sie einfach die Methode, die bereits in Facets zur Verfügung steht, der am weitesten verbreiteten Ruby-Bibliothek aller Zeiten:
require 'facets/string/titlecase'
class String
def titleize
split(/(\W)/).map(&:capitalize).join
end
end
require 'test/unit'
class TestStringTitlecaseAndTitleize < Test::Unit::TestCase
def setup
@str = "i just saw \"twilight: new moon\", and man! it's crap."
@res = "I Just Saw \"Twilight: New Moon\", And Man! It's Crap."
end
def test_that_facets_string_titlecase_works
assert_equal @res, @str.titlecase
end
def test_that_my_own_broken_string_titleize_works
assert_equal @res, @str.titleize # FAIL
end
end
Wenn Sie etwas möchten, das den typischen Schreibstilrichtlinien besser entspricht (d. H. Wörter wie "und" nicht großgeschrieben), gibt es auf GitHub ein paar "titleize" -Steine.
Wenn Sie Rails verwenden (wirklich alles, was Sie brauchen, ist ActiveSupport, das Teil von Rails ist), können Sie titleize
verwenden:
"MY STRING HERE".titleize
# => "My String Here"
"HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |Word|
Word.capitalize
end
#=> "Hello World How Are You"
Von ActiveSupport
"MY STRING HERE".gsub(/\b('?[a-z])/) { $1.capitalize }
Wenn Sie Rails/ActiveSupport verwenden, ist die Methode bereits kostenlos verfügbar.
string = "MY STRING HERE"
string.split(" ").map {|Word| Word.capitalize}.join(" ")
So funktioniert das: Die .split(" ")
teilt es auf Leerzeichen auf, so dass wir jetzt ein Array haben, das wie ["my", "string", "here"]
aussieht. Der Aufruf map
durchläuft jedes Element des Arrays und ordnet es der temporären Variablen Word
zu, die wir dann capitalize
nennen. Jetzt haben wir ein Array, das wie ["My", "String", "Here"]
aussieht, und schließlich verwandeln wir dieses Array wieder in einen String, indem join
ing jedes Element mit einem Leerzeichen ("") belegt.
Unicode-kompatibles Titlecase für Ruby 2.4.0+:
class String
def titlecase
split(/([[:alpha:]]+)/).map(&:capitalize).join
end
end
>> "я только что посмотрел \"леди исчезает\", и это чума!".titlecase
=> "Я Только Что Посмотрел \"Леди Исчезает\", И Это Чума!"
(basierend auf https://stackoverflow.com/a/1792102/788700 )
"MY STRING HERE".titlecase
Erfüllt den Job (es ist jedoch eine Methode im Rails-Edelstein) http://apidock.com/Rails/String/titlecase
Ich habe versucht, den Code zu verbessern ... bereit für Kritiker und Vorschläge.
class Book
attr_accessor :title
def title=(new_title)
notcap=%w(and the a in of an)
str=''
new_title.gsub(/(\w|\s)\w+/) do |Word|
Word.strip!
if not notcap.include? Word
Word.capitalize!
end
str += ' ' + Word
end
str.strip!
str = str[0].upcase + str[1..-1]
@title = str
end
end