给定像“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:
如何创建一个只接受一个输入并返回两个变量的方法?
由于
答案 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]
答案 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