我正在尝试将Ruby中的全大写字符串转换为小写字符串,但每个单词的第一个字符都是大写字母。例如:
将“MY STRING HERE”转换为“My String Here”。
我知道我可以使用.downcase方法,但这会使所有小写(“我的字符串在这里”)。我正在扫描文件中的所有行并进行此更改,那么是否有一个正则表达式可以通过ruby来实现此目的?
谢谢!
答案 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)
"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
=> "Я Только Что Посмотрел \"Леди Исчезает\", И Это Чума!"
答案 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
有关更多示例和文档,请查看官方存储库:
答案 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