web-dev-qa-db-fra.com

Conversion d'une chaîne de majuscules en minuscules avec Ruby

J'essaie de convertir une chaîne entièrement en majuscule Ruby en minuscule, mais le premier caractère de chaque mot étant en majuscule. Exemple:

convertir "MY STRING HERE" en "My String Here". 

Je sais que je peux utiliser la méthode .downcase, mais cela rendrait tout en minuscule ("my string here"). J'analyse toutes les lignes d'un fichier et j'effectue cette modification. Y a-t-il une expression régulière que je peux utiliser avec Ruby pour y parvenir?

Merci!

46
wsb3383

En essayant de mettre au point ma propre méthode (incluse ci-dessous à titre de référence), je me suis rendu compte qu'il y avait quelques cas assez difficiles. Mieux vaut simplement utiliser la méthode déjà fournie dans Facettes , la plus géniale des librairies Ruby evar:

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

Si vous voulez quelque chose qui soit plus conforme aux directives de style d'écriture typiques (c'est-à-dire ne met pas les mots en majuscules comme "et"), il existe quelques gemmes "titleize" sur GitHub.

36
Jörg W Mittag

Si vous utilisez Rails (vous n'avez besoin que de ActiveSupport, qui fait partie de Rails), vous pouvez utiliser titleize:

"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

De ActiveSupport

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

Si vous utilisez Rails/ActiveSupport, la méthode est déjà disponible gratuitement.

8
Simone Carletti
string = "MY STRING HERE"
string.split(" ").map {|Word| Word.capitalize}.join(" ")

La façon dont cela fonctionne: La .split(" ") le divise en espaces, nous avons donc maintenant un tableau qui ressemble à ["my", "string", "here"]. L'appel map itère sur chaque élément du tableau, en l'attribuant à la variable temporaire Word, que nous appelons ensuite capitalize on. Nous avons maintenant un tableau qui ressemble à ["My", "String", "Here"], et finalement, nous transformons ce tableau en chaîne en joining chaque élément avec un espace ("").

4
bantic

Titlecase compatible avec Unicode pour Ruby 2.4.0+:

class String
  def titlecase
    split(/([[:alpha:]]+)/).map(&:capitalize).join
  end
end
>> "я только что посмотрел \"леди исчезает\", и это чума!".titlecase
=> "Я Только Что Посмотрел \"Леди Исчезает\", И Это Чума!"

(basé sur https://stackoverflow.com/a/1792102/788700 )

1
Adobe
"MY STRING HERE".titlecase

Fait le travail (c'est une méthode dans la gemme de Rails, cependant) http://apidock.com/Rails/String/titlecase

1
marcindobry

J'ai essayé d'améliorer le code ... prêt pour les critiques et les suggestions.

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.