在正则表达式期间返回传递给#scan的块的结果

时间:2010-04-10 21:42:12

标签: ruby regex

我已经搜索过,但却无法找到正确的做法。我逐行读取文件,并希望从每行的正则表达式创建一个新对象。我没有使用XML解析器,因为数据格式不正确,下面列出的是我需要从每一行获得的所有内容。

我似乎无法通过扫描来返回块的结果。它只返回原始字符串。我通过创建这个temp变量暂时解决了这个问题,但我确信有更好的方法。

enum = File.foreach(filename)  

enum.map do |line|
   temp = nil
   line.scan(/<cab id="(\w+)" updates="(\d+)"/) { |a,b| temp = Cab.new(a,b) }
   temp
end

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我愿意:

enum.map {|line| Cab.new(*line.match(/<cab id="(\w+)" updates="(\d+)"/)[1,2]) }

或者如果我希望它更具可读性:

enum.map {|line|
  line =~ /<cab id="(\w+)" updates="(\d+)"/
  Cab.new($1, $2)
}

答案 1 :(得分:0)

扫描+地图可能吗?

line.scan(/<cab id="(\w+)" updates="(\d+)"/).map { |a,b| Cab.new(a,b) }