2013-12-20 131 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); 
} 
相關問題