NodeJS readFileSync和Regex结果文本

时间:2019-02-11 23:24:45

标签: node.js regex

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

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

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

class.js:

/*
    by: Mike Freudiger
*/

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

alert();

/* end of file */

parse.js:

var fs = require('fs');

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

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

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

var doc = `/*
        by: Mike Freudiger
    */

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

    alert();

    /* end of file */`

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

...此外,我意识到,使用另一个npm包或其他东西可能会有更好的方法来发表这些评论,但现在我真的只是想知道为什么这两个字符串不同。

1 个答案:

答案 0 :(得分:1)

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

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

因此您得到:

var fs = require('fs');

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