我是红宝石的新手。 现在,我有关于通过ruby编程进行文本拆分的问题。
我的文字就像
AA:0.88:320:800|BB:0.82:1040:1330|CC:0.77:1330:1700|DD:0.71:1700:2010|EE:1.00:2070:2390
所以我需要结果(处理直到文本结束)
AA 0.88
BB 0.82
CC 0.77
DD 0.71
EE 1.00
如何编码。现在我只能用“|”分开。
最好的关注。
答案 0 :(得分:4)
使用String#split
:
s = 'AA:0.88:320:800|BB:0.82:1040:1330|CC:0.77:1330:1700|DD:0.71:1700:2010|EE:1.00:2070:2390'
s.split('|').each do |substring|
name, num, * = substring.split(':')
puts "#{name} #{num}"
end
输出:
AA 0.88
BB 0.82
CC 0.77
DD 0.71
EE 1.00
答案 1 :(得分:1)
这里仅供参考,是一个正则表达式版本:
s = 'AA:0.88:320:800|BB:0.82:1040:1330|CC:0.77:1330:1700|DD:0.71:1700:2010|EE:1.00:2070:2390'
p s.scan /(?:\||\A)([^:]+):([^:]+)/
# => [["AA", "0.88"], ["BB", "0.82"], ["CC", "0.77"], ["DD", "0.71"], ["EE", "1.00"]]
代码更短但更难以阅读和调试。在此之前使用其他答案!
编辑:
这里有一些注释的正则表达式:
s.scan %r{
(?: \| | \A) # Look for start of string (\A) or '|' (\|) but do not include in capture (?:)
([^:]+) # Look for and capture one or more characters that are not ':'
: # Look for but do not capture a ':', Not captured as line is not in parenthesis.
([^:]+) # Repeat second line.
}x # x modifies the regexp to allow comments.
答案 2 :(得分:0)
s = 'AA:0.88:320:800|BB:0.82:1040:1330|CC:0.77:1330:1700'
s.split('|').map { |item| # produces an array and remaps it
s1, s2, * = item.split(':')
puts "#{s1} #{s2}"
[s1, s2]
}
希望它有所帮助。
答案 3 :(得分:0)
使用gsub
和
正则表达式:
str = "AA:0.88:320:800|BB:0.82:1040:1330|CC:0.77:1330:1700|" +
"DD:0.71:1700:2010|EE:1.00:2070:2390"
puts str.gsub(':',' ').scan(/(([A-Z])\2 \d\.\d\d)/).map(&:first)
AA 0.88
BB 0.82
CC 0.77
DD 0.71
EE 1.00
以下是步骤:
s1 = str.gsub(':',' ')
# => "AA 0.88 320 800|BB 0.82 1040 1330|CC 0.77 1330 1700|
DD 0.71 1700 2010|EE 1.00 2070 2390" (broken for display)
s2 = s1.scan(/(([A-Z])\2 \d\.\d\d)/)
# => [["AA 0.88", "A"], ["BB 0.82", "B"], ["CC 0.77", "C"],
["DD 0.71", "D"], ["EE 1.00", "E"]]
s3 = s2.map(&:first)
# => ["AA 0.88", "BB 0.82", "CC 0.77", "DD 0.71", "EE 1.00"]
在正则表达式中,/(...)/
和([A-Z])
分别是第一个和第二个捕获组。 \2
等于第二组捕获的内容,因此`([A-Z])\2
要求相同的两个大写字母一起显示(例如,'CC')。