将一串名称转换为带有姓名和姓氏的名称

时间:2015-07-13 14:21:43

标签: ruby string

我需要使用Ruby执行以下操作:

  

将此字符串"joseph jeremiah bloggs"变为"J.J.Bloggs"

它必须适用于任意数量的名称,其姓氏始终为完整单词,其他名称为姓名首字母。

到目前为止,我有以下代码:

def initials(name)
  name.split.map(&:capitalize).join('.')
end

返回"Joseph.Jeremiah.Bloggs"

有没有办法获得前两个单词的首字母?

5 个答案:

答案 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)

更新了解决方案(即使此线程已关闭,我仍然想帮助其他人)。我觉得这个解决方案对于新的Ruby开发人员来说更容易理解。

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")