我正在尝试将Ruby中的全大写字符串转换为小写字符串,但每个单词的第一个字符都是大写字母.例:
将"我的绳索"转换为"我的弦在这里".
我知道我可以使用.downcase方法,但这会使一切都小写("我的字符串在这里").我正在扫描文件中的所有行并进行此更改,那么是否有正则表达式我可以通过ruby来实现此目的?
谢谢!
Jam*_*sen 85
如果您正在使用Rails(实际上您只需要ActiveTrapport,这是Rails的一部分),您可以使用titleize:
"MY STRING HERE".titleize
# => "My String Here"
Run Code Online (Sandbox Code Playgroud)
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)
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上会有一些"标题化"的宝石.
"MY STRING HERE".gsub(/\b('?[a-z])/) { $1.capitalize }
Run Code Online (Sandbox Code Playgroud)
如果您使用的是Rails/ActiveSupport,则该方法已免费提供.
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通过在每个元素上添加一个空格(“”),将该数组转换为字符串。