正则表达式在调试器中工作,但不在 JavaScript

Regex working in debugger, but not in JavaScript

我想获取文本文件中第一个空行之前的所有内容。

我找到了一个 working regex,但是当我尝试在 Javascript 中完成相同的任务时,它不起作用。

(正在加载文件内容)

async function readDir() {
    return new Promise((resolve,reject) => {
        fs.readdir('./content', (err, files) => {
            if(err) { reject(err) }
            resolve(files)
        });
    });
}

readDir().then((files) => {
    files.forEach(file => {
        var filepath = path.resolve('./content/'+file)
        if(filepath.endsWith('.txt')) {
            if(fs.statSync(filepath)["size"] > 0) {
                let data = fs.readFileSync(filepath).toString();
                let reg = /^[\s\S]*?(?=\n{2,})/;
                console.log(data.match(reg)) //returns null
            }
        }
    });
})

编辑:

正如 O. Jones 指出的那样,问题出在行尾。我的正则表达式没有在我的文件中出现 \r\n 行结尾。

现在,这个似乎可以完成工作:/^[\s\S]*?(?=(\r\n\r\n?|\n\n))/m

您似乎想要将 re 与文件的整个多行内容相匹配。你需要多行标志来做到这一点。

试试这个

let reg = /^[\s\S]*?(?=\n{2,})/m;

注意在 re 关闭 / 之后的 m。有关更多说明,请参阅此处名为 使用标志进行高级搜索 的部分:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

此外,您可能遇到了 line-ending 问题。 Linux/ FreeBSD/ UNIX 系统使用 \n 又名换行符来标记每行的结尾。 Mac 对此使用 \r 又名 return。而Windows用的是\r\n,每行末尾两个字符。是的,我们都知道 xxx 脖子有多痛。

所以你的空行检测器可能太简单了。 Regular Expression to match cross platform newline characters 尝试使用它来匹配 cross-os 行的结尾

\r\n?|\n

表示 return 后跟一个可选的换行符,或者只是一个换行符。

它可能看起来像这样。

let reg = /^[\s\S]*?(?=(\r\n?|\n)(\r\n?|\n))/m;

连续查找其中两个行尾模式(抱歉,我没有测试过)。

您可能想试试:

const EOL = require('os').EOL; // system newline.
const regex = new Regex('^.*?(?=' + EOL + EOL + ')', 's'); // everything before first two newlines.