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!
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.
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"
"HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |Word|
Word.capitalize
end
#=> "Hello World How Are You"
"MY STRING HERE".gsub(/\b('?[a-z])/) { $1.capitalize }
Si vous utilisez Rails/ActiveSupport, la méthode est déjà disponible gratuitement.
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 join
ing chaque élément avec un espace ("").
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 )
"MY STRING HERE".titlecase
Fait le travail (c'est une méthode dans la gemme de Rails, cependant) http://apidock.com/Rails/String/titlecase
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