Conversion de la chaîne majuscule en casse en utilisant Ruby

J’essaie de convertir une chaîne majuscule en Ruby en une minuscule, mais avec le premier caractère de chaque mot en majuscule. Exemple:

convertir “MON CHAINE ICI” en “Ma chaîne ici”.

Je sais que je peux utiliser la méthode .downcase, mais cela rendrait toutes les minuscules (“ma chaîne ici”). Je scanne toutes les lignes d’un fichier et fais ce changement, alors y a-t-il une expression régulière que je peux utiliser à travers ruby ​​pour y parvenir?

Merci!

Tout en essayant de trouver ma propre méthode (incluse ci-dessous à titre de référence), j’ai réalisé qu’il y avait des cas en coin assez méchants. Mieux vaut simplement utiliser la méthode déjà fournie dans Facettes , la plus puissante bibliothèque eva de Ruby:

require 'facets/ssortingng/titlecase' class Ssortingng def titleize split(/(\W)/).map(&:capitalize).join end end require 'test/unit' class TestSsortingngTitlecaseAndTitleize < 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 se conforme plus étroitement aux directives de style d’écriture habituelles (c’est-à-dire qui ne met pas en majuscule les mots comme "et"), il ya quelques gemmes "titleize" sur GitHub.

Si vous utilisez Rails (tout ce dont vous avez besoin est ActiveSupport, qui fait partie de Rails), vous pouvez utiliser titleize :

 "MY STRING HERE".titleize # => "My Ssortingng Here" 
 "HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |word| word.capitalize end #=> "Hello World How Are You" 

De ActiveSupport

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

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

 ssortingng = "MY STRING HERE" ssortingng.split(" ").map {|word| word.capitalize}.join(" ") 

La manière dont cela fonctionne: le .split(" ") divise en espaces, donc nous avons maintenant un tableau qui ressemble à ["my", "ssortingng", "here"] . L’appel de map itération sur chaque élément du tableau, en l’affectant à un word variable temporaire, que nous appelons ensuite en capitalize . Maintenant, nous avons un tableau qui ressemble à ["My", "Ssortingng", "Here"] , et finalement nous transformons ce tableau en chaîne en join chaque élément avec un espace (“”).

 "MY STRING HERE".titlecase 

Est-ce que le job (c’est une méthode dans la gemme Rails) http://apidock.com/rails/Ssortingng/titlecase

Titlecase pour Ruby 2.4.0+ compatible Unicode:

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

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

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.ssortingp! if not notcap.include? word word.capitalize! end str += ' ' + word end str.ssortingp! str = str[0].upcase + str[1..-1] @title = str end end 

Capitaliser chaque mot d’une phrase en utilisant ruby, sans regex .. car malheureusement ceux-ci me font peur

 class Book attr_accessor :title def title=(new_title) result = [] words = new_title.split(' ') words.each do |word| capitalized = word[0].upcase + word[1..word.length].downcase result.push(capitalized) end @title = result.join(' ') end end