Javascript 如何打印包含特定字符串的行?

Javascript 如何打印包含特定字符串的行?,javascript,node.js,regex,Javascript,Node.js,Regex,我想打印字符串中包含日期的行,我正在使用split模块来实现该任务。下面的代码总是打印else语句 ctrl.js fs.readFile(dir + '/' + logFile, 'utf8', function(err, data) { var lines = data.split('\n'); var linesWithDate = lines.split('|')[0].replace(/[\[\]']+/g,''); lines.forE

我想打印字符串中包含日期的行,我正在使用split模块来实现该任务。下面的代码总是打印else语句

ctrl.js

fs.readFile(dir + '/' + logFile, 'utf8', function(err, data) {
        var lines = data.split('\n');
        var linesWithDate = lines.split('|')[0].replace(/[\[\]']+/g,'');
        lines.forEach(function(line) {
            if (linesWithDate) {
                console.log('print lines with date',line);
             } else {
                console.log('print lines without date',line);
             }
        }
    });
文件数据

[2017-03-23T18:13:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum
Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy 
[2017-03-23T19:20:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum
如何打印包含特定字符串的行

我想打印字符串中包含日期的行,我正在使用split模块来实现该任务。下面的代码总是打印else语句

我认为您没有使用
split
模块。这个例子有:

const split = require('split');
const regex = require('regex-iso-date');
fs.createReadtStream(path.join(dir, logFile), 'utf8')
  .pipe(split()).on('data', (line) => {
    if (regex().test(line)) {
        console.log('Line with date:', line);
    } else {
        console.log('Line without date:', line);
    }
});
请注意,这不一定是有效日期,因为它可能与2017-13-13等日期相匹配…-要测试有效日期,请仅查看以下答案:

或者,如果您想匹配特定字符串,如
[2017-03-23T18:13:16Z]
,则可以尝试以下方法:

const split = require('split');
const regex = /\[\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\w+\]/;
fs.createReadtStream(path.join(dir, logFile), 'utf8')
  .pipe(split()).on('data', (line) => {
    if (regex.test(line)) {
        console.log('Line with date:', line);
    } else {
        console.log('Line without date:', line);
    }
});

请注意,如果文件中有无效日期,它也将匹配这些日期。

以下是一些代码,它只按行打印出有效的解析日期。我使用readline模块而不是readfile,但是您应该能够通过替换
输入:process.stdin
: "严格使用",

var sExample = '[2017-03-23T18:13:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum';

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.setPrompt('Enter example string to test > ');
rl.prompt();

rl.on('line', (line) => {
  var sCandidate = line.split('|')[0].replace(/[\[\]']+/g,'');

  if (Date.parse(sCandidate)) {                   //it is a valid date
    console.log(sCandidate);
  }

  process.exit(0);
});

你试过正则表达式吗?下面是正则表达式的JavaScript文档链接。仅仅使用grep有什么问题吗?至少40年来,grep都能在睡眠中做到这一点。@torazaburo我从未使用过grep任何参考或示例?嗯,谷歌“grep”。如果第二行没有日期合并,我还有合并任务。这是最终目标,不确定grep是否也能帮助实现。我可以使用split package来完成此任务让我看看我使用split和regex模块在代码中添加了第二个答案,仅打印
console.log('line without date:',line)
它的打印全部lines@hussain正则表达式可能太严格了。参见第三个示例。我更新了我的答案。所以在第三个答案中,正则表达式将不再是函数,它将抛出exception@hussain是的,去掉括号就行了。请参阅我的最新答案。
var sExample = '[2017-03-23T18:13:16Z]|zlpv7490|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event lorem ipsum';

const readline = require('readline');
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});

rl.setPrompt('Enter example string to test > ');
rl.prompt();

rl.on('line', (line) => {
  var sCandidate = line.split('|')[0].replace(/[\[\]']+/g,'');

  if (Date.parse(sCandidate)) {                   //it is a valid date
    console.log(sCandidate);
  }

  process.exit(0);
});