Javascript 基于正则表达式的行删除脚本(JS)不工作

Javascript 基于正则表达式的行删除脚本(JS)不工作,javascript,node.js,regex,Javascript,Node.js,Regex,我有一个脚本,它读取文件并通过模式比较字符串,如果返回false,它将删除.txt文件中的行 这是我的密码 const readline = require('readline'); const lineReplace = require('line-replace') const fs = require('fs'); const inputFileName = './outputfinal.txt'; const readInterface = readline.createInterfa

我有一个脚本,它读取文件并通过模式比较字符串,如果返回false,它将删除.txt文件中的行

这是我的密码

const readline = require('readline');
const lineReplace = require('line-replace')
const fs = require('fs');
const inputFileName = './outputfinal.txt';

const readInterface = readline.createInterface({
    input: fs.createReadStream(inputFileName),
});

let testResults = [];
readInterface.on('line', line => {
    testResult = test(line);
    console.log(`Test result (line #${testResults.length+1}): `, testResult);
    testResults.push({ input: line, testResult } );
    if (testResult == false){
        console.log(`Line #${testResults.length} will get deleted from this list`);
        lineReplace({
          file: './outputfinal.txt',
          line: testResults.length,
          text: '',
          addNewLine: false,
          callback: onReplace   
        });

        function onReplace({file, line, text, replacedText}) {

        };
    };
});

// You can do whatever with the test results here.
//readInterface.on('close', () => {
//    console.log("Test results:", testResults);
//});

function test(str){

    let regex = /^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/; // email regex

    str = str.split(","); 

    // string should be of length 3 with str[1] number of length 7
    if(str && str.length === 3 && Number(str[1]) && str[1] ) {

        let temp = str[0].split("-");

        // check for 85aecb80-ac00-40e3-813c-5ad62ee93f42 separately.
        if(temp && temp.length === 5 &&  /[a-zA-Z\d]{8}/.test(temp[0]) &&  /[a-zA-Z\d]{4}/.test(temp[1]) &&  /[a-zA-Z\d]{4}/.test(temp[2]) &&  /[a-zA-Z\d]{4}/.test(temp[3]) &&  /[a-zA-Z\d]{12}/.test(temp[4])){

            // email regex
            if(regex.test(str[2])) {
                return true;
            } else {
                return false;
            }
        } else { 
            return false
        }
    } else {
        return false;
    }
}

但是不工作,返回错误没有这样的文件或目录,我不认为这是正确的方法做一个行删除脚本首先,如果错误是“没有这样的文件或目录”是因为文件不存在。请首先检查文件是否存在于项目的同一根目录中

第二,不要使用库“line replace”,如果您检查代码,这将创建一个tmp文件并用替换文件重写tmp中的所有文件。完成该过程后,tmp文件将重命名为原始文件

第三,如果分析代码,“lineReplace”是异步的。因此,有时会尝试在同一时间多次打开该文件,然后再次在同一时间写入该文件。这将产生意想不到的结果

最好的建议是,您必须了解文件在nodejs中的工作方式和承诺(异步):

如果您看到下面的代码,您将看到下面的步骤:

  • 创建tmp路由
  • 创建tmp文件
  • 做出承诺:
    • 创建一个
      readline
      接口
    • 用try-catch处理每一行,以便在出现错误时拒绝
    • 完成该过程后,使用try-catch将tmp文件替换为原始文件,以防出错时拒绝
  • 等待完成承诺,如果出现错误,请删除tmp文件
const fs=require('fs');
const readline=require('readline');
异步函数replaceLineWithConditional(路径文件,条件){
//tmp文件名
const tmpFilePath=`${pathFile}.tmp`;
//创建写流
const tmpStream=fs.createWriteStream(tmpFilePath);
//处理它
const processFile=新承诺((解决、拒绝)=>{
const rl=readline.createInterface({
输入:fs.createReadStream(路径文件),
});
//生产线
rl.on(“行”,(输入)=>{
试一试{
if(条件(输入)){
tmpStream.write(输入);//输入
tmpStream.write(“\n”);//换行
}
}捕捉(错误){
//拒绝错误
拒绝(错误);
}
});
//完成
rl.on(“关闭”),()=>{
试一试{
//移动TMP文件
tmpStream.close();
重命名同步(tmpFilePath,pathFile);
//解决它
决心(正确);
}捕捉(错误){
//拒绝错误
拒绝(错误);
}
});
});
试一试{
//等待承诺
返回等待处理文件;
}捕捉(错误){
//删除tmp文件并抛出错误
tmpStream.close();
fs.unlinkSync(tmpFilePath);
犯错误;
}
}
因此,您可以使用条件函数进程作为回调调用该函数。例如,我想保留所有长度超过3且不以“a”开头的行:

//异步/等待:
等待replaceLineWithConditional(“./test.txt”,(行)=>{
返回行.length>3&&/^[^a]/.test(行);
});
//然后/抓住:
replaceLineWithConditional(“./test.txt”,(行)=>{
返回行.length>3&&/^[^a]/.test(行);
}).然后(…).抓住(…);
输入:

Hi
你好
abcdef
A.
拉拉
输出:

你好 拉拉
如果需要文件,请不要以结束行结束。(注意:)这可能是测试
fs
库中知识的测验题:)

FYI:
/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/
容易发生灾难性回溯。无论您在哪里找到此模式,都要让他们知道它至少应该是
/^\w+([.-]\w+*@\w+([.-]\w+*(\.-]\w+)(\.\w{2,3})+$/
,如果它说没有这样的文件或目录,请检查文件的路径是否正确。另外,createReadStream可能只允许您读取,而不允许写入。请提供一个预期输出的示例。另外,不确定这应该做什么:如果(str&&str.length==3&&Number(str[1])&&str[1]),您是在尝试检查str[1]是否是一个数字,还是将其转换为一个数字并检查它是否为null或未定义?请,看看这些网站:;