如何使用正则表达式检查字符串是否包含日期?

时间:2017-03-31 16:02:45

标签: javascript node.js split fs

我有文件,其中我的日志在多行中每个记录的事件都有日期,我正在尝试编写逻辑 如果行以日期和开头 如果第二行不 将日期合并到第一行作为最终目标,在代码下面作为第一步打印行,其中日期与没有日期但始终打印 其他声明,     知道什么是错误的工具?

我的问题不是关于日期对象的验证我只是想检查字符串是否包含日期,任何格式打印这些行。问题是我想使用日期参数组合多行og事件。

ctrl.js

fs.readFile(dir + '/' + logFile, 'utf8', function(err, data) {
    var line = data.split('\n');
    var messageDateInfo = line.split('|')[0].replace(/[\[\]']+/g, '');
    var d = parseDate(messageDateInfo);

    function parseDate(str) {
        var m = str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);
        return (m) ? new Date(m[3], m[2] - 1, m[1]) : null;
    }
    if (line.includes(d)) {
        console.log('print lines with date', line);
    } else {
        console.log('print lines without date', line);
    }
});

fileData

[2017-03-23T18:13:16Z]|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event { newTopology: 
   [ '-0000001337',
     '-0000001338',
     '-0000001339',
     '-0000001340',
     '-0000001341',
     '-0000001342' ],
  oldTopology: 
   [ '-0000001337',
     '-0000001338',
     '-0000001339',
     '-0000001340',
     '-0000001341' ],
  workerId: 6,
  pid: 30488 }
[2017-03-23T18:13:16Z]|verbose|bmid: n/a|infra.topicWorkers|topology changed, emitting topology event { newTopology: 
   [ '-0000001337',
     '-0000001338',
     '-0000001339',
     '-0000001340',
     '-0000001341',
     '-0000001342' ],
  oldTopology: [],
  workerId: 4,

1 个答案:

答案 0 :(得分:1)

您正在使用:

str.match(/^(\d{1,2})\/(\d{1,2})\/(\d{4})$/);

此处str = {[2017-03-23T18:13:16Z],带有方括号[]

str为ISO日期格式,并且您将其与永远不会匹配的'dd / MM / yyyy'正则表达式匹配

尝试使用此正则表达式/^(\d{4})\D?(0[1-9]|1[0-2])\D?([12]\d|0[1-9]|3[01])(\D?([01]\d|2[0-3])\D?([0-5]\d)\D?([0-5]\d)?\D?(\d{3})?)?$/

AND

new Date(m[3], m[2] - 1, m[1])您只返回日,月和年。

同时将其与具有日期和时间line的{​​{1}}进行比较。

您需要从数组中传递它们。