创建一个给定字符串(fname lname)的方法返回两个

时间:2011-04-29 21:05:03

标签: ruby-on-rails ruby regex ruby-on-rails-3

给定像“james bond”或“roger r burns”这样的字符串我想创建一个接受输入并返回名字和姓氏的方法:

对于上述情况:

Input: James Bond
Returns:
  fname: james
  lname: bond

Input: Roger r Burns
Returns
  fname: Roger r
  lname: Burns

Input: Roger
Returns
  fname: Roger
  lname:

Input:
Returns
  fname:
  lname:
  • 如果空输入没有错误但返回空值。

如何创建一个只接受一个输入并返回两个变量的方法?

由于

7 个答案:

答案 0 :(得分:3)

你可以尝试这样的事情:

last, first = str.reverse.split(' ', 2).collect{|s| s.reverse}

另见:Ruby: Split string at character, counting from the right side
工作示例:http://ideone.com/CA9aZ

答案 1 :(得分:1)

请注意,此方法不会进行特殊情况或错误检查,并对输入内容进行巨大假设。

def name_split(string)
  split_string = string.split(' ')
  if split_string.count > 1      
    return split_string[0..split_string.count-2].join(" "), split_string.last
  else
    return split_string.first, nil # nil if there's no last name
  end
rescue NoMethodError
  return nil, nil
end

fname, lname = name_split("Roger Burns")   # => "Roger", "Burns"
fname, lname = name_split("Roger r Burns") # => "Roger r", "Burns"
fname, lname = name_split("Roger")         # => "Roger", nil
fname, lname = name_split(nil)             # => nil, nil
fname, lname = name_split(3)               # => nil, nil

答案 2 :(得分:1)

def sname(name)
  name.match(/^(\w+)(?:.*\b(\w+))?$/)[1..2] rescue raise ArgumentError
end

sname "James Bond" # => ["James", "Bond"]
sname "James J. Bond" # => ["James", "Bond"]
sname "James" # => ["James", nil]
sname "" # => raises ArgumentError

答案 3 :(得分:1)

这个怎么样:

def explode_name(str)
  !str.nil? && str.respond_to?(:split) ? ((2 - (a = str.split(' ', 2)).length).times { a << nil };a) : [nil,nil]
end

explode_name "Mr James Bond" #=> ["Mr", "James Bond"] 
explode_name "Mr Bond"       #=> ["Mr", "Bond"] 
explode_name "Mr"            #=> ["Mr", nil] 
explode_name ""              #=> [nil, nil] 
explode_name nil             #=> [nil, nil] 
explode_name 6               #=> [nil, nil] 

A comparison for programming's sake

答案 4 :(得分:0)

您可以为中间名添加另一个变量。如果存在,则将中间首字母分配给第一个名称变量的一部分。如果它不存在,则将中间变量(实际上是姓氏)移动到姓氏变量。

答案 5 :(得分:0)

这是怎么回事?

def split_name(full_name)
  name = full_name || ''
  split = name.split(' ')
  split.push(nil) if split.length < 2
  return split[0, split.length - 1].join(' '), split.last  
end

names = ['James Bond', 'Roger r Burns', 'Roger', '']
names.each do |name|
  puts "Input: #{name}"
  output = split_name(name)
  puts "First name: #{output.first}"
  puts "Last name: #{output.last}"
  puts "****"
end

答案 6 :(得分:0)

试试这个

def split_names(name)
  parts = name.blank? ? ["", ""] : name.split(" ")
  parts << "" if parts.size == 1
  [parts[0..-2].join(" "), parts.last]
end