Bootstrap

正则表达式用于报文中日期时间的编程查找

报文中日志的日期时间格式各种各样,如何提取出正确的日期,考虑使用正则表达式,这样以后即使有新的格式,只要修改表达式即可,而不需要重新编程进行字符串查找。

学习正则表达式的编程知识:C++使用正则匹配

先确认写的正则表达式是否正确,通过以下网站进行在线验证:
正则表达式在线验证
输入表达式:\d{4}[/]\d{2}[/]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2}[.]\d{3}|\d{4}[/]\d{2}[/]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2}|\d{4}[-]\d{2}[-]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2}[.]\d{3}|\d{4}[-]\d{2}[-]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2}
这里用到了四个条件,用|或起来,
再输入需要验证的报文:

104M_DIAG_1>2023/05/09 10:14:27.249[重要]:<<-- 68 FA 08 00 2023/05/09 10:14:27 00 3F 40 00 33 33 A7 41 00 40 40 00 33 33 A7 41 00 41 40 00 33 33 A7 41 00 42 40 00 33 33 A7 41 00 43 40 00 33 33 A7 41 00 44 40 00 33 33 A7 41 00 45 40 00 33 33 A7 41 00 46 40 00 33 33 A7 41 00 47 40 00 33 33 A7 41 00 48 40 00 33 33 A7 41 00 49 40 00 33 33 A7 41 00 4A 40 00 33 33 A7 41 00 4B 40 00 33 33 A7 41 00 4C 40 00 48 E1 A4 41 00 4D 40 00 33 33 A7 41 00 4E 40 00 33 33 A7 41 00 4F 40 00 33 33 A7 41 00 50 40 00 33 33 A7 41 00 51 40 00 33 33 A7 41 00 52 40 00 33 33 A7 41 00 53 402023-05-09 10:14:27 00 33 33 A7 41 2023-05-09 10:14:27.001 54 40 00 33 33 A7 41 00 55 40 00 33 33 A7 41 00 56 40 00 33 33 A7 41 00 57 40 00 33 33 A7 41 00 58 40 00 D7 A3 A4 41 00 59 40 00 33 33 A7 41 00 5A 40 00 33 33 A7 41 00 5B 40 00 33 33 A7 41 00 5C 40 00 33 33 A7 41 00
···
验证结果:
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/57e83539e28f498fb88567b8332fe652.png)
下面开始编程:
smatch result;
string::const_iterator iter_begin = s.cbegin();
string::const_iterator iter_end = s.cend();
while (regex_search(iter_begin, iter_end, result, pattern))
{
cout << "查找成功:" << result[0] << endl;
cout << "查找结果子串的在源串中的迭代器位置" << *result[0].first << endl;
cout << "查找结果子串的在源串后面的位置" << *result[0].second << endl;
iter_begin = result[0].second;    //更新迭代器位置
}
return 0;
}

测试代码通过。这个可以查找字符串中所有符合条件的,我只需要第一个就行了
即result[0]
注意表达式,\d要换成\d
优化后的正则表达式:
(\d{4}[/|-]\d{2}[/|-]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2}.(\d{6}|\d{3}))|(\d{4}[/|-]\d{2}[/|-]\d{2}[ ]\d{2}[:]\d{2}[:]\d{2})
适合如下格式:
2023/05/09 10:14:27.249
2024/06/09 10:14:28
2023-06-10 11:14:27.349
2024-05-09 10:15:27
2023-04-27 15:36:07.123456

;