2013-12-20 99 views
1

我有一个小的节点应用程序,需要一些输入,应用正则表达式来提取一些信息,并应返回一个匹配数组。所有这一切都很简单,但我所看到的行为并不是预期的。我的理解是,如果我输入了多条匹配此正则表达式的行,那么每行都将是匹配返回的数组中的一个元素。不幸的是,它看起来像数组只包含最后一行的匹配组。有没有办法重写这个,而不是迭代两次输入,这样我就可以用每行匹配的数据填充一个嵌套数组?将比赛组作为元素返回将是一件好事,但我需要为每一行都做到这一点。最终目标是将所有这些转换为下游应用程序的格式化JSON。javascript正则表达式匹配只返回最后一个匹配

感谢您抽空看看...

现在CODE

也可以用于实验在这里一个cloud 9 IDE。

var util = require('util'); 

var re = /(processed)(.*?)\((.*?)\)(.*?)([0-9]\.[0-9]+[0-9])/g; 
var data; 
var returnData = []; 
var Parser = function(input) { 
    util.log("Instantiating Parser"); 

    this.data = input; 
}; 

Parser.prototype.parse = function(callback) { 
    util.log("In the parser"); 

    this.returnData = re.exec(this.data); 
    callback(this.returnData); 
} 

exports.Parser = Parser; 

和测试文件:

var Parser = require("./parser.js").Parser; 
var util = require('util'); 
var fs = require('fs'); 

var data = "worker[0] processed packet (0x2000000, 1200358, t) in 0.000021 seconds\n" + 
"worker[0] processed packet (0x2000000, 400115, b) in 0.000030 seconds\n"+ 
" (0) Registration Stats: (1387305947, 0x3d00000a, 17024, 2504, 0, 400109, 400116, b)\n"+ 
"worker[0] processed packet (0x1000000, 400116, b) in 0.000045 seconds\n"+ 
"worker[0] processed packet (0x1000000, 1200369, t) in 0.000024 seconds\n"; 

util.log("creating new parser"); 
var Parser = new Parser(data); 

util.log("calling parse"); 
Parser.parse(function(data) { 
     for (var i=0; i < data.length; i++) 
      util.log(data[i]); 
}); 

这里是debuggex正则表达式。

+0

'[0-9] + [0-9]'这个子模式没有意义。 –

+0

@Casimir et Hippolyte yep,完全没有必要。感谢您指出了这一点。 – janarde

回答

1

re.exec每次执行时只返回一个匹配项。如果你想要所有匹配的数组,你需要这样做:

var matchedData = []; 
var match; 
while (match = re.exec(this.data)) { 
    matchedData.push(match); 
} 
相关问题