使用node.js清理来自stdin的流

时间:2019-05-08 01:01:11

标签: node.js regex sanitization

我有这个脚本:

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

有人知道只有在其中至少有一个数字的情况下才能替换该字符串吗?

1 个答案:

答案 0 :(得分:1)

如果您的脚本已修改,那么如何修改?

在您的脚本中,match函数中的replacer()是分割的字符串。输入"ageoageag ageagoie ag77eage"时,ageoageagageagoieag77eage的每个值都以match的形式给出。 replacer()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

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

编辑:

如果输入的值之间用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(" ");