我有一个字符串数组,我需要按特定顺序格式化,数组如下,每个字符串的索引
array = [
[0] "Bonk Radek S Male Green 6/3/1978",
[1] "Bouillon Francis G Male Blue 6/3/1975",
[2] "Smith Steve D Male Red 3/3/1985"
]
目前每个字符串都被格式化:
姓氏,名字,中间,性别,收视颜色,出生日期
我需要编写将其格式化的代码:
姓氏,名字,中间,性别,出生日期,喜欢的颜色
如何将字符串重新排列为我想要的格式并返回数组?
答案 0 :(得分:1)
使用正则表达式替换(String#sub
):
array = [
"Bonk Radek S Male Green 6/3/1978",
"Bouillon Francis G Male Blue 6/3/1975",
"Smith Steve D Male Red 3/3/1985"
]
array.map { |s| s.sub(/(\S+)(\s+)(\S+)$/, '\3\2\1') }
# => [
# "Bonk Radek S Male 6/3/1978 Green",
# "Bouillon Francis G Male 6/3/1975 Blue",
# "Smith Steve D Male 3/3/1985 Red"
# ]
答案 1 :(得分:0)
虽然为了美化代码,人们可能想要为数据重新映射引入一些启发式方法,但我会坚持使用简单的硬编码重新排序:
array = [
"Bonk Radek S Male Green 6/3/1978",
"Bouillon Francis G Male Blue 6/3/1975",
"Smith Steve D Male Red 3/3/1985"
]
array.map { |p|
data = p.split(/\s+/);
[data[0],data[1],data[2],data[3],data[5],data[4]].join(', ')
}
#=> [
# [0] "Bonk, Radek, S, Male, 6/3/1978, Green",
# [1] "Bouillon, Francis, G, Male, 6/3/1975, Blue",
# [2] "Smith, Steve, D, Male, 3/3/1985, Red"
#]
希望它有所帮助。
答案 2 :(得分:0)
另一种方式:
a = array.map(&:split).transpose
a[-1], a[-2] = a[-2], a[-1]
a.transpose.map { |v| v.join(' ') }
#=> ["Bonk Radek S Male 6/3/1978 Green",
# "Bouillon Francis G Male 6/3/1975 Blue",
# "Smith Steve D Male 3/3/1985 Red"]
答案 3 :(得分:0)
我会考虑将逻辑拆分成更小的部分并引入其他简单的对象,而不是仅仅试图坚持使用Ruby String
require 'ostruct'
Person = Struct.new(:surname, :forename, :initial, :gender, :colour, :date_of_birth)
array = [
"Bonk Radek S Male Green 6/3/1978",
"Bouillon Francis G Male Blue 6/3/1975",
"Smith Steve D Male Red 3/3/1985"
].map { |o| Person.new(*o.split(/\s+/)) }
array.each do |person|
puts "%{surname} %{forename} %{initial} %{gender} %{date_of_birth} %{colour}" % person.to_h
end
to_h
投入其中使用真实对象打破这一点可以让您在长期运行中获得更大的灵活性,就像您希望按日期排序一样,您需要将这些日期字符串解析为真实对象,而Person
对象可以处理