读取正则表达式多个匹配中的所有子匹配

时间:2012-10-23 09:39:16

标签: javascript regex node.js

今天我正在尝试解析'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;

“---迭代---”它每行只有一个,相反,它应该是倍数!

我会链接一个精美的屏幕截图,让您直观地了解我期待的数据enter image description here

正如您所看到的,上面是3组数据,每组数据都有多次出现

有任何帮助吗? :P

编辑为澄清:

这是以下行的结果:

root      5213  0.0  2.1   8688  2760 ?        Ss   11:33   0:01 sshd: root@pts/0 

enter image description here

正如您所看到的,生成的数组是1维的,而不是完全包含结果, HAS 至少是2维

更新

现在我已经解决了像我这样的代码问题:

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中使用该功能吗?

1 个答案:

答案 0 :(得分:0)

查看exec function的返回值。

它返回首次匹配的索引,原始字符串和元素[0]...[n]中的捕获组。

所有这些都在您的输出中可用,您只需要遍历数组的单个元素。