我试图在Ruby中找到最有效的方法来转换"John Di Bello"
中的 String "John DI BELLO"
。
基本上,我总是在第一个单词的名字上使用capitalize
,在姓氏也可以由两个单词组成的名字上需要upcase
。
此刻我正在整理一切
authors = ['John Di Bello', 'Terry Payton']
authors.map { |a| a.upcase }
#=> ['JOHN DI BELLO', 'TERRY PAYTON']
我找不到在每个数组项中大写第一个单词的简单方法。
答案 0 :(得分:3)
将其拆分,将大写的和大写,然后加入。
['John Di Tri Bello', 'Terry Payton'].map do |s|
s.
split(/\s+/, 2).
reduce { |n, s| [n.capitalize, s.upcase] }.
join(' ')
end
#⇒ ["John DI TRI BELLO", "Terry PAYTON"]
答案 1 :(得分:0)
其他选项,映射为:
string.partition(' ').first + string.partition(' ')[1..-1].join.upcase
因此,它变成:
array.map { |s| s.partition(' ').first + s.partition(' ')[1..-1].join.upcase }
答案 2 :(得分:0)
我想扩展mudasobwas answer,因为在这种情况下使用 reduce 可能有点神秘。编写解决方案的一种更快捷的方法可能是:
authors = ['John Di Bello', 'Terry Payton']
authors.map do |name|
first_name, last_name = name.split(' ', 2)
"#{first_name.capitalize} #{last_name.upcase}"
end
#=> ["John DI TRI BELLO", "Terry PAYTON"]
您可以将first_name, last_name = ...
括在括号中,以更清楚地表明您正在使用数组分解,例如。 (first_name, last_name) = ...
,但这不是必需的。
参考:
答案 3 :(得分:0)
在可能的情况下,我更喜欢在原处修改字符串,而不是将其转换为数组,先修改数组,然后将结果重新组合为字符串(也许是foible)。另外,在2018年我们不应该支持Unicode吗? 1
def capitalize_then_upcase(str)
str.gsub(/\p{Alpha}+/).with_index { |s,i| i.zero? ? s.capitalize : s.upcase }
end
arr = ['JohN di Bello', 'Hopalong Cassidy', 'Franz Josef Strauß']
arr.map { |str| capitalize_then_upcase(str) }
#=> ["John DI BELLO", "Hopalong CASSIDY", "Franz JOSEF STRAUSS"]
这使用String#gsub的形式,其中在没有块的情况下返回一个枚举数。
\p{Alpha}
可以替换为[[:alpha:]]
。两者都匹配Unicode字母(大写和小写)。有关文档,请在Regexp中以字符串形式搜索。
1。请参见this article,以了解String#upcase(可能是String#capitalize)对Unicode的支持。