使用 node.js 清理来自标准输入的流

Sanitize stream from stdin using node.js

我有这个脚本:

let stdin = '';

process.stdin
  .setEncoding('utf8')
  .resume()
  .on('data', d => {

   stdin+= d;
});


const regexs = [
  [/(?=.*[^a-zA-Z])[0-9a-zA-Z]{7,300}/g, function replacer(match, p1, p2, p3, offset, string) {
    return match.slice(0,2) + 'xxxxx' + match.slice(6);
  }]
];


process.stdin.once('end', end => {

  for(let r of regexs){
    stdin = stdin.replace(r[0], r[1]);
  }
  console.log(stdin);
});

我是这样使用它的:

 echo "ageoageag ageagoie ag77eage" | node sanitize-stdin.js 

我明白了:

agxxxxxeag agxxxxxie agxxxxxge

但我真的只想替换长度为 6-300 的字符串(如果其中包含数字)。所以我正在寻找的输出是:

ageoageag ageagoie agxxxxxge

任何人都知道如何仅在其中至少有一个数字的情况下替换该字符串?

如果你的脚本被修改了,这个修改怎么样?

在您的脚本中,replacer() 函数中的 match 是拆分后的字符串。当输入 "ageoageag ageagoie ag77eage" 时,ageoageagageagoieag77eage 的每个值都给出为 matchreplacer() returns 所有 match 的大小写为 match.slice(0,2) + 'xxxxx' + match.slice(6)。这样,返回agxxxxxeag agxxxxxie agxxxxxge

为了只处理match个数,这样修改怎么样?请修改replacer()函数如下

发件人:

return match.slice(0,2) + 'xxxxx' + match.slice(6);

收件人:

return /[0-9]/.test(match) ? match.slice(0,2) + 'xxxxx' + match.slice(6) : match;

结果:

ageoageag ageagoie agxxxxxge

如果我误解了你的问题,这不是你想要的结果,我深表歉意。

编辑:

如果输入的值之间用space隔开,比如ageoageag ageagoie ag77eage,这样修改怎么样?在这个修改中,const regexs没有被使用。

发件人:

for(let r of regexs){
  stdin = stdin.replace(r[0], r[1]);
}

收件人:

stdin = stdin.split(" ").map(function(e) {
  return e.length > 6 && e.length <= 300 && /[0-9]/.test(e) ? e.slice(0,2) + 'xxxxx' + e.slice(6) : e;
}).join(" ");