使用Ruby将大写字符串转换为title-case

时间:2009-11-24 17:30:18

标签: ruby string

我正在尝试将Ruby中的全大写字符串转换为小写字符串,但每个单词的第一个字符都是大写字母。例如:

将“MY STRING HERE”转换为“My String Here”。

我知道我可以使用.downcase方法,但这会使所有小写(“我的字符串在这里”)。我正在扫描文件中的所有行并进行此更改,那么是否有一个正则表达式可以通过ruby来实现此目的?

谢谢!

10 个答案:

答案 0 :(得分:85)

如果您正在使用Rails(实际上您只需要ActiveTrapport,这是Rails的一部分),您可以使用titleize

"MY STRING HERE".titleize
# => "My String Here"

答案 1 :(得分:51)

"HELLO WORLD HOW ARE YOU".gsub(/\w+/) do |word|
  word.capitalize
end
#=> "Hello World How Are You"

答案 2 :(得分:37)

在尝试提出我自己的方法(包括在下面作为参考)时,我意识到有一些非常讨厌的角落案例。最好只使用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'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

如果你想要更符合典型写作风格指导的东西(即不会像“和”那样大写字母),GitHub上会有一些“标题化”的宝石。

答案 3 :(得分:8)

来自ActiveSupport

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

如果您使用的是Rails / ActiveSupport,则该方法已免费提供。

答案 4 :(得分:5)

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

这种方式有效: .split(" ")将它分隔在空格上,所以现在我们有一个看起来像["my", "string", "here"]的数组。 map调用遍历数组的每个元素,将其分配给临时变量word,然后我们将其调用capitalize。现在我们有一个看起来像["My", "String", "Here"]的数组,最后我们通过join用空格(“”)将每个元素转回一个字符串。

答案 5 :(得分:1)

"MY STRING HERE".titlecase

是否有工作(但这是Rails gem中的一种方法) http://apidock.com/rails/String/titlecase

答案 6 :(得分:1)

Ruby 2.4.0 +的Unicode感知标题:

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

(基于https://stackoverflow.com/a/1792102/788700

答案 7 :(得分:0)

我尝试改进代码......为评论家和建议做好准备。

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

答案 8 :(得分:0)

ruby​​核心本身不支持将字符串从大写(单词)大写转换为大写单词。

因此,您需要自己实施或使用现有的gem。

有一个名为 lucky_case 的小红宝石,可让您轻松地将字符串从支持的10多种情况中的任何一种转换为另一种情况:

require 'lucky_case'

# to get capital word case as string
LuckyCase.capital_word_case('MY STRING HERE')    # => 'My String Here'
# or the opposite way
LuckyCase.upper_word_case('Capital Word Case')   # => 'MY STRING HERE'

如果愿意,您甚至可以猴子修补String类:

require 'lucky_case/string'

'MY STRING HERE'.capital_word_case  # => 'My String Here'
'MY STRING HERE'.capital_word_case! # => 'My String Here' and overwriting original

有关更多示例和文档,请查看官方存储库:

https://github.com/magynhard/lucky_case

答案 9 :(得分:-1)

使用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