Преобразование строки верхнего регистра в заголовок с использованием Ruby
Я пытаюсь преобразовать строку в верхнем регистре в Ruby в нижний регистр, но каждое слово первого символа является верхним регистром. Пример:
преобразуйте "МОЙ СТРЕЛК ЗДЕСЬ" в "My String Here".
Я знаю, что могу использовать метод .downcase, но это сделает все в нижнем регистре ( "моя строка здесь" ). Я просматриваю все строки в файле и делаю это изменение, так что есть регулярное выражение, которое я могу использовать через ruby для достижения этого?
Спасибо!
Ответы
Ответ 1
Пытаясь придумать мой собственный метод (приведенный ниже для справки), я понял, что там довольно неприятные угловые случаи. Лучше просто использовать метод, уже представленный в Facets, самый лучший в мире ресурс 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 crap."
@res = "I Just Saw \"Twilight: New Moon\", And Man! It 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
Если вам нужно что-то, что более близко соответствует типичным рекомендациям стиля письма (т.е. не использует буквы типа "и" ), на GitHub есть несколько "газетов".
Ответ 2
Если вы используете Rails (на самом деле все, что вам нужно, это ActiveSupport, входящее в состав Rails), вы можете использовать titleize
:
"MY STRING HERE".titleize
# => "My String Here"
Ответ 3
"HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |word|
word.capitalize
end
#=> "Hello World How Are You"
Ответ 4
От ActiveSupport
"MY STRING HERE".gsub(/\b('?[a-z])/) { $1.capitalize }
Если вы используете Rails/ActiveSupport, этот метод уже доступен бесплатно.
Ответ 5
string = "MY STRING HERE"
string.split(" ").map {|word| word.capitalize}.join(" ")
Как это работает:
.split(" ")
разбивает его на пробелы, так что теперь мы имеем массив, который выглядит как ["my", "string", "here"]
. Вызов map
выполняет итерацию по каждому элементу массива, назначая его временной переменной word
, которую мы вызываем capitalize
on. Теперь у нас есть массив, который выглядит как ["my", "string", "here"]
, и, наконец, мы возвращаем этот массив в строку join
для каждого элемента с пробелом ("").
Ответ 6
"MY STRING HERE".titlecase
Работает ли это (это метод в Rails gem, однако)
http://apidock.com/rails/String/titlecase
Ответ 7
Юникод-заметный заголовок для Ruby 2.4.0 +:
class String
def titlecase
split(/([[:alpha:]]+)/).map(&:capitalize).join
end
end
>> "я только что посмотрел \"леди исчезает\", и это чума!".titlecase
=> "Я Только Что Посмотрел \"Леди Исчезает\", И Это Чума!"
(на основе fooobar.com/questions/84260/...)
Ответ 8
Я пытаюсь улучшить код... готов к критике и предложениям.
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
Ответ 9
Заглавные буквы каждого слова в выражении с использованием ruby, без регулярного выражения.. потому что, к сожалению, это пугает меня
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