今天我正在尝试解析“ps aux”输出(从 node.js 服务器发出)
所以我做了一个快乐的正则表达式来解析这些值,我想把所有这些花哨的信息放到一个简单的 JSON 对象中:-)
问题是,我制作的正则表达式有 3 个匹配组,进行多个匹配......我什至不知道是否有可能返回所有匹配项。
var spawn = require("child_process").spawn;
function exec(http_req, http_resp){
var re_ps = /(?:([\d\.\w\-\?\/\+]+)\s+){8}(?:((?:\d+\:\d+)|(?:\w+\d+))\s+){2}([^\n]+)/g,
result_re_ps,
array_re_ps = [];
//[USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT], dates[START, TIME], COMMAND
var ps_process = spawn("ps", ["aux"]);
ps_process.stdout.on("data", function(data){
var split_data = data.toString().split('\n');
for (var i=1; i < 2; i++){
while ((result_re_ps = re_ps.exec(split_data[i])) != null){
console.log("--- while iteration ---");
console.dir(result_re_ps);
//console.dir(result_re_ps);
}
}
//http_resp.write(data);
});
ps_process.on("exit", function (code) {
if (code !== 0) {
console.log("ps_process exited with code " + code);
}
http_resp.end();
});
}
exports.exec = exec;
“--- while迭代---”每行只有一个,相反,它应该是倍数!
我将链接一个精美的屏幕截图,让您直观地了解我期望的数据类型
如您所见,上面是 3 组数据,每组都有多次出现
有什么帮助吗?:p
编辑澄清:
这是如下一行的结果:
root 5213 0.0 2.1 8688 2760 ? Ss 11:33 0:01 sshd: root@pts/0
如您所见,结果数组是一维的,而不是要完全包含结果,它必须至少是二维的
更新:
现在我已经解决了像这样改变我的代码的问题:
var spawn = require("child_process").spawn;
function exec(http_req, http_resp){
var array_re_ps = [];
var re_ps1 = /(?:([\d\.\w\-\?\/\+]+)\s+)/g,
re_ps2 = /(?:((?:\d+\:\d+)|(?:\w+\d+))\s+)/g,
re_ps3 = /([^\n]+)/g;
//[USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT], dates[START, TIME], COMMAND
var ps_process = spawn("ps", ["aux"]);
ps_process.stdout.on("data", function(data){
var split_data = data.toString().split('\n');
for (var i=20; i < 21; i++){
array_re_ps[0] = [], array_re_ps[1] = [];
for (var j=0; j<8; j++){
array_re_ps[0].push(re_ps1.exec(split_data[i])[1]);
}
re_ps2.lastIndex = re_ps1.lastIndex;
for (var j=0; j<2; j++){
array_re_ps[1].push(re_ps2.exec(split_data[i])[1])
}
re_ps3.lastIndex = re_ps2.lastIndex;
array_re_ps[2] = re_ps3.exec(split_data[i])[1];
console.dir(array_re_ps);
}
});
ps_process.on("exit", function (code) {
if (code !== 0) {
console.log("ps_process exited with code " + code);
}
http_resp.end();
});
}
exports.exec = exec;
基本上,我将我的长正则表达式拆分为 3 个较小的正则表达式,然后我会循环查看它们的结果。如果您尝试代码,我会完全按照我的意愿格式化结果数组,但我仍然认为这是一个侧面解决方案。
由于正则表达式允许您“多次解析组”,因此可以在 javascript 中具有该功能吗?