【问题标题】:Regex working in debugger, but not in JavaScript [duplicate]正则表达式在调试器中工作,但不适用于 JavaScript [重复]
【发布时间】:2021-01-25 11:54:46
【问题描述】:

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

我找到了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

【问题讨论】:

  • 您的文件的具体内容是什么?您确定有两个换行符紧随其后(即在空行中没有其他空格,包括\r)?
  • 正则表达式的链接包括 txt 文件的确切内容
  • 那么不,它也适用于 javascript。请注意,将文件复制粘贴到文本区域会更改行尾。
  • 我试过这个,它对我有用。你对文件内容做错了
  • 我通过 Visual Studio Code 文件资源管理器创建了文本文件,并从这里复制粘贴内容:gutenberg.org/files/36/36-0.txt 当我对文件内容进行 JSON.stringify 时,我得到:"The War世界\r\n10-10-2020\r\n\r\nI.\r\n战争前夜。\r\n\r\n没有人会相信十九世纪的最后几年\ r\n这个世界正被比人类更伟大的智慧\r\n 和他自己的智慧一样敏锐而密切地注视着;当人们忙于\r\n他们自己...对不起,我有不知道它可能是什么..

标签: javascript node.js regex fs end-of-line


【解决方案1】:

你不妨试试:

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

【讨论】:

    【解决方案2】:

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

    试试这个

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

    注意m 在 re 关闭 / 之后。有关详细说明,请参阅此处名为 Advanced Searching With Flags 的部分:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions

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

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

    \r\n?|\n
    

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

    它可能看起来像这样。

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

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

    【讨论】:

    • 在我的情况下没有什么不同..它可能是文件
    • 请看我的编辑。也许行尾是问题所在。当然,我刚刚看到你的评论。
    • 是的,就是这样,尽管您的正则表达式版本只返回了第一行。经过一番修修补补,我发现这是可行的:/^[\s\S]*?(?=(\r\n\r\n?|\n\n))/m
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-13
    • 2013-05-01
    • 2012-07-24
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2020-05-30
    相关资源
    最近更新 更多