2010-04-10 21 views
1

我已经搜索过,并且找不到正在尝试的正确方法。我一行一行地读取一个文件,并希望从每行的正则表达式创建一个新的对象。我没有使用XML解析器,因为数据格式不正确,下面列出了我需要从每行中获得的全部内容。在正则表达式期间传递给#scan的块的返回结果

我似乎无法得到扫描返回块的结果。它只是返回原始字符串。我通过创建这个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 

感谢您的任何帮助。

回答

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) 
} 
+0

感谢mckeed提供了两种写作方式。这给出了我正在寻找的结果。我想我应该去看看你演示的比赛。 – Oli 2010-04-10 22:05:40

+0

是的,我应该更多地解释匹配(或=〜简写)是什么,当你想匹配正则表达式对一个字符串一次,而扫描是为了当你需要匹配多次对一个字符串。如果您的源文件在匹配之间没有换行符,您仍然可以对整个文件内容使用扫描来连续获取所有匹配项。 – mckeed 2010-04-11 21:04:04

0

扫描+地图可能?

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

感谢stereofrog,但是它返回一个数组与单个条目,而我真的想尝试只返回块本身的结果。 – Oli 2010-04-10 22:01:50

相关问题