separate - Conversión de cadena de mayúsculas en mayúsculas con Ruby
ruby class string (9)
Intento convertir una cadena en mayúsculas en Ruby en minúsculas, pero con el primer carácter de cada palabra en mayúscula. Ejemplo:
convierte "MI CADENA AQUÍ" en "Mi cadena aquí".
Sé que puedo usar el método .downcase, pero eso haría que todo esté en minúsculas ("mi cadena aquí"). Estoy escaneando todas las líneas en un archivo y haciendo este cambio, entonces ¿hay alguna expresión regular que pueda usar a través de Ruby para lograr esto?
¡Gracias!
Al tratar de encontrar mi propio método (incluido a continuación para referencia), me di cuenta de que hay algunos casos de esquina bastante desagradables. Mejor solo usa el método ya provisto en Facets , el más asombroso evasor de la biblioteca de Ruby:
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 desea algo que cumpla más con las pautas de estilo de escritura típicas (es decir, no usa mayúsculas en palabras como "y"), hay un par de gemas "titleize" en GitHub.
"MY STRING HERE".gsub(//b(''?[a-z])/) { $1.capitalize }
Si está utilizando Rails / ActiveSupport, el método ya está disponible de forma gratuita.
Intenté mejorar el código ... listo para críticas y sugerencias.
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
Portada de Unicode-aware para Ruby 2.4.0+:
class String
def titlecase
split(/([[:alpha:]]+)/).map(&:capitalize).join
end
end
>> "я только что посмотрел /"леди исчезает/", и это чума!".titlecase
=> "Я Только Что Посмотрел /"Леди Исчезает/", И Это Чума!"
(basado en https://.com/a/1792102/788700 )
Si está utilizando Rails (realmente todo lo que necesita es ActiveSupport, que es parte de Rails), puede usar titleize
:
"MY STRING HERE".titleize
# => "My String Here"
Usa mayúsculas en cada palabra en una oración usando ruby, sin expresiones regulares ... porque desafortunadamente esas me asustan
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
"HELLO WORLD HOW ARE YOU".gsub(//w+/) do |word|
word.capitalize
end
#=> "Hello World How Are You"
"MY STRING HERE".titlecase
El trabajo (es un método en la gema de Rails, sin embargo) http://apidock.com/rails/String/titlecase
string = "MY STRING HERE"
string.split(" ").map {|word| word.capitalize}.join(" ")
La forma en que esto funciona: El .split(" ")
divide en espacios, por lo que ahora tenemos una matriz que se parece a ["my", "string", "here"]
. La llamada de map
itera sobre cada elemento de la matriz, asignándola a una word
variable temporal, que luego llamaremos capitalize
. Ahora tenemos una matriz que se parece a ["My", "String", "Here"]
, y finalmente volvemos a convertir esa matriz en una cadena join
cada elemento con un espacio ("").