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

我有一个在不同的正则表达式测试网站上测试过的正则表达式:

\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() 的布尔值是假的,而 .match() 的对象是空的。

任何帮助将不胜感激。

4

2 回答 2

3

与其尝试解析错误的输出ls不如简单地使用 node.js 提供的文件系统操作。使用文件系统操作,您可以确保您的程序将在(几乎)任何边缘情况下工作,因为输出定义良好。如果该文件夹将来包含的文件多于或少于三个,它甚至可以工作!

正如您在评论中所说,您想要文件夹中文件的名称和日期/时间。那么让我们来看看:

fs.readdir(path, callback):fs.readdir将为您提供路径中指定的文件夹中的文件名数组。您可以将它们传递fs.stat给以找出 mtime:

fs.stat(path, callback):fs.stat()会给你一个fs.Stats包含属性中的 mtime的对象mtime

因此,您的代码之后将如下所示:

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 回答