我需要使用Ruby执行以下操作:
将此字符串
"joseph jeremiah bloggs"
变为"J.J.Bloggs"
它必须适用于任意数量的名称,其姓氏始终为完整单词,其他名称为姓名首字母。
到目前为止,我有以下代码:
def initials(name)
name.split.map(&:capitalize).join('.')
end
返回"Joseph.Jeremiah.Bloggs"
有没有办法获得前两个单词的首字母?
答案 0 :(得分:4)
这是跟随您的代码的一种方式:
def initials(name)
*rest, last = name.split
(rest.map{|e| e[0]} << last).map(&:capitalize).join('.')
end
使用splat *
使rest
收集除最后一个名称之外的所有名称。
答案 1 :(得分:2)
你可以这样做:
"joseph jeremiah bloggs"
.gsub(/\w+\s*/){|s| ($'.empty? ? s : "#{s[0]}.").capitalize} #'
# => "J.J.Bloggs"
或
"joseph jeremiah bloggs"
.gsub(/\w+\s+/){|s| "#{s[0].upcase}."}.sub(/\w+\z/, &:capitalize)
# => "J.J.Bloggs"
答案 2 :(得分:0)
def initialize_name(name)
name = name.split(" ")
name.map {|n| n.equal?(name.last) ? n.capitalize : n[0].capitalize }.join(". ")
end
initialize_name "joseph jeremiah blogg" # => J. J. Blogg
这就是我想出的。不是最漂亮的,但它有效,我会尝试让你看起来更漂亮。
joe = "joseph jeremiah blogg"
def initialize_name(name)
return_value = ""
name = name.split(" ")
name.each do |n|
if n.equal? name.last
return_value << "#{n.capitalize}"
else
return_value << "#{n[0].capitalize}. "
end
end
return_value
end
puts initialize_name joe # => "J. J. Blogg"
答案 3 :(得分:0)
另一种松散地构建在提供的代码上的解决方案:
def initials(name)
name.scan(/([[:alpha:]])[[:alpha:]]*/).flatten.join.upcase
end
使用 [[:alpha:]]
(a "POSIX bracket expression") 而不是经典的 \w
来匹配名称中出现的非 ASCII 字符。正则表达式匹配整个单词但只捕获首字母。
答案 4 :(得分:-1)
def initials(name)
(name.split.drop(1).map do |subname|
subname[0].upcase
end + [name.split.last]).join('.')
end
initials("Bob Smith Jones")