webentwicklung-frage-antwort-db.com.de

Konvertierung von Großbuchstaben in Titel mit Ruby

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!

46
wsb3383

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.

36
Jörg W Mittag

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"
84
James A. Rosen
"HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |Word|
  Word.capitalize
end
#=> "Hello World How Are You"
51
sepp2k

Von ActiveSupport

"MY STRING HERE".gsub(/\b('?[a-z])/) { $1.capitalize }

Wenn Sie Rails/ActiveSupport verwenden, ist die Methode bereits kostenlos verfügbar.

8
Simone Carletti
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 joining jedes Element mit einem Leerzeichen ("") belegt.

4
bantic

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 )

1
Adobe
"MY STRING HERE".titlecase

Erfüllt den Job (es ist jedoch eine Methode im Rails-Edelstein) http://apidock.com/Rails/String/titlecase

1
marcindobry

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
0
K.S.A.