JavaScript正则expression式匹配只返回最后一场比赛

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

谢谢参观…

现在的代码

也可以在云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; 

和一个testing文件:

 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]); }); 

这里是正则expression式的debuggex 。

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

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