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

wsb*_*383 49 ruby string

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

将"我的绳索"转换为"我的弦在这里".

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

谢谢!

Jam*_*sen 85

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

"MY STRING HERE".titleize
# => "My String Here"
Run Code Online (Sandbox Code Playgroud)

  • 请注意他回答了关于Rails的问题.如果你使用Rails,这个答案是最好的.但是,如果您只使用Ruby,则可能不希望只需要整个ActiveSupport库来标记字符串.这里有效率考虑因素.但是当我在这里时,他们为什么不为英国人"称号"呢? (13认同)
  • 完美的答案,其他人都在重新发明轮子,你正在使用提供的轮子,这是使用Ruby on Rails的要点 (7认同)
  • `titleize`适用于这个用例(大写全部大写字符串),但是对于大小写混合大小写有一种问题:''jOhn'.titleize#=>"J Ohn"`.这只是我的意思. (7认同)

sep*_*p2k 54

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

  • 优秀而简洁.说明:gsub替换所有出现的内容.正则表达式意味着'任何子字符串由一个单词字符(`\ w')组成,后跟0个或多个单词字符(`+`)."请注意,如果你使用{| word | word,这可以是一个单行.大写}而不是"做"和"结束" - 这只是一个偏好问题. (4认同)
  • 对于那些寻找单行的人 - 你也可以做"HELLO WORLD".gsub(/\w + /,&:capitalize)` (3认同)
  • 在保留连字符的同时,在 erb 模板循环中对我想大写的文件名列表中的单行非常适合我:`"name-another-third".gsub(/\w+/){|word| word.capitalize}` => "Name-Another-Third (2认同)

Jör*_*tag 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
Run Code Online (Sandbox Code Playgroud)

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


Sim*_*tti 8

来自ActiveSupport

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

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


ban*_*tic 5

string = "MY STRING HERE"
string.split(" ").map {|word| word.capitalize}.join(" ")
Run Code Online (Sandbox Code Playgroud)

工作方式:.split(" ")将其拆分为空格,因此现在我们有了一个看起来像的数组["my", "string", "here"]。该map调用遍历数组的每个元素,并将其分配给临时变量word,然后我们对其进行调用capitalize。现在我们有了一个看起来像的数组,["My", "String", "Here"]最后join通过在每个元素上添加一个空格(“”),将该数组转换为字符串。

  • 请注意,如果字符串包含换行符或制表符,它将把多个连续的空格变成一个空格并中断。 (7认同)