Ruby中将“ John DI BELLO”中的“ John Di Bello”转换的最短方法

时间:2018-09-28 16:56:21

标签: ruby string

我试图在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']

我找不到在每个数组项中大写第一个单词的简单方法。

4 个答案:

答案 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的支持。