关于node.js:NodeJS readFileSync和Regex结果文本

NodeJS readFileSync and Regex the resulting text

本问题已经有最佳答案,请猛点这里访问。

希望将注释从JS文件中刮出。想着我可以创建一个函数来输入.js文件,执行RegExp匹配并使用fs.readFile()和string.match()输出字符串数组;

这是一个过于简化的示例:

我有两个文件class.js(用于读取)和parse.js(用于执行文本解析)

class.js:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
/*
    by: Mike Freudiger
*/

/**
* one
* @returns 'Hello World'
*/
function one () {
        return 'Hello World';
}

alert();

/* end of file */

parse.js:

1
2
3
4
5
6
7
8
var fs = require('fs');

var file = fs.readFile('C:\\\\Users\\\\mikef\\\\Desktop\\\
ode_regex_test\\\\class.js', 'utf8', function(err, doc) {
    var comments = doc.match(/(\\/\\*\\*(.|\
)+?\\*\\/)/g);
    console.log(comments);
});

当我运行节点parse.js时,控制台输出为null。

但是,当我在多行字符串上运行正则表达式匹配时,会得到预期的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var doc = `/*
        by: Mike Freudiger
    */

    /**
    * one
    * @returns 'Hello World'
    */
    function one () {
            return 'Hello World';
    }

    alert();

    /* end of file */`

有人知道为什么readFile()字符串的行为与字符串文字不同吗?

...此外,我意识到也许可以使用另一个npm包或类似的东西来发布这些注释,这是一种更好的方法,但是现在我真的只想知道为什么这两个字符串不同。


如vsemozhetbyt所述,class.js文件中使用的换行符似乎是\
\
\

匹配这些换行符的最简单(最快)方法之一是在正则表达式中使用[\\s\\S]而不是(.|\
)

因此您得到:

1
2
3
4
5
6
7
var fs = require('fs');

var file = fs.readFile('C:\\\\Users\\\\mikef\\\\Desktop\\\
ode_regex_test\\\\class.js', 'utf8', function(err, doc) {
    var comments = doc.match(/(\\/\\*\\*[\\s\\S]+?\\*\\/)/g);
    console.log(comments);
});