1

解析しようとしている簡単なテキストがいくつかあります。

total 4.0K
-rw-rw-r-- 1 346 Mar  1 08:50 save_1
-rw-rw-r-- 1   0 Feb 28 17:28 save_2
-rw-rw-r-- 1   0 Feb 28 17:28 save_3

また、さまざまな正規表現テストWebサイトでテストした正規表現があります。

\w{3}\s+\d{1,2}\s\d{2}\:\d{2}\s\w{4}\_\d

Node.jsアプリケーションの次の関数の入力としてサンプルテキストを取得し、月から行末までの3つの異なる一致を持つオブジェクトまたは配列を返そうとしています。

function parse(str) {
    var regex = new RegExp("\w{3}\s+\d{1,2}\s\d{2}\:\d{2}\s\w{4}\_\d");
    return regex.test(str);
    //return str.match(regex);
}

.test()のブール値がfalseで、.match()のオブジェクトがnullである理由がわかりません。

どんな助けでも大歓迎です。

4

2 に答える 2

3

悪いlsの出力を解析しようとする代わりに、node.jsによって提供されるファイルシステム操作を使用する必要があります。ファイルシステム操作を使用すると、出力が明確に定義されているため、プログラムが(ほぼ)どのエッジケースでも機能することを確認できます。将来、フォルダに3つより多いまたは少ないファイルが含まれる場合でも機能します。

コメントで述べたように、フォルダからのファイルの名前と日付/時刻が必要です。では、以下を見てみましょう。

fs.readdir(path, callback)fs.readdirpathで指定されたフォルダ内のファイル名の配列を提供します。それらをに渡しfs.statて、mtimeを見つけることができます。

fs.stat(path, callback):プロパティにmtimeが含まれてfs.stat()いるオブジェクトを提供します。fs.Statsmtime

したがって、コードは後で次のようになります。

fs.readdir('dir', function (err, files) {
    for (var i = 0; i < files.length; i++) {
        (function () {
            var filename = files[i]
            fs.stat('dir/' + filename, function (err, stats) {
                console.log(filename + " was last changed on " + stats.mtime);
            });
        })();
    }
});

出力は次のとおりです。

[timwolla@~/test]node test.js
5 was last changed on Fri Mar 01 2013 20:24:35 GMT+0100 (CET)
4 was last changed on Fri Mar 01 2013 20:24:34 GMT+0100 (CET)
2 was last changed on Fri Mar 01 2013 20:24:33 GMT+0100 (CET)

戻り値が必要な場合はSync、これらのメソッドのそれぞれのバージョンを使用してください。ただし、これらはnode.jsイベントループをブロックします。

于 2013-03-01T18:40:08.467 に答える
0

正規表現は\、文字列をRegExpコンストラクターに渡すときにエスケープする必要があるため、失敗しています。つまり、である\s必要があります\\s

var regex = new RegExp( "\\w{3}\\s+\\d{1,2}\\s\\d{2}:\\d{2}\\s\\w{4}_\\d", "g" );

すべてのg一致を取得するためにフラグが追加されます。

于 2013-03-01T19:08:22.107 に答える