Преобразование строки верхнего регистра в заголовок с использованием 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 для каждого элемента с пробелом ("").

Ответ 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