0

今日、私は「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;

「---反復中---」は、各行に1つだけですが、代わりに倍数にする必要があります。

派手なスクリーンショットをリンクして、私が期待しているデータの種類を視覚的に理解できるようにしますここに画像の説明を入力してください

ご覧のとおり、上記は3つのデータグループであり、それぞれに複数のデータがあります。

何か助けはありますか?:p

明確にするために編集:

これは、次のような行の結果です。

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

ここに画像の説明を入力してください

ご覧のとおり、結果の配列は1次元ですが、結果を完全に含めるには、少なくとも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でその機能を使用することは可能ですか?

4

1 に答える 1

0

exec関数の戻り値を見てください。

最初に一致したインデックス、元の文字列、および要素内のキャプチャグループを返します[0]...[n]

これはすべて出力で利用できます。配列の単一の要素を反復処理する必要があります。

于 2012-10-23T09:42:34.903 に答える