如何在ruby中拆分和获取数据

时间:2014-01-20 06:52:12

标签: ruby string

我是红宝石的新手。 现在,我有关于通过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

如何编码。现在我只能用“|”分开。

最好的关注。

4 个答案:

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