正则表达式在调试器中工作,但不在 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.
我想获取文本文件中第一个空行之前的所有内容。
我找到了一个 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.