我试图匹配看起来像这样的字符串:
Mar 25 19:17:55 127.0.0.1 user:[pool-15-thread-17] INTOUCH; 0; INFO; SOFTLOADSERVICE; Install started
带正则表达式。这是我定义正则表达式的代码:
#include <boost/regex.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <tuple>
#include <string>
const std::string softload_startup = "(\\w{3}) (\\d{1,2}) (\\d{2}):
(\\d{2}):(\\d{2})*SOFTLOADSERVICE;Install started\\s"; //NOLINT
const boost::regex softload_start(softload_startup);
class InTouchSoftload {
public:
explicit InTouchSoftload(std::string filename);
private:
std::string _log_name;
std::tuple<unsigned int, std::string> software_update_start;
};
我在这里叫它:
int main() {
fin.open(input_file);
if (fin.fail()) {
std::cerr << "Failed to open " << input_file << std::endl;
exit(1);
}
while (std::getline(fin, line)) {
line_no++;
if (regex_match(line, softload_start)) {
std::cout << line << std::endl;
}
}
return 0;
}
不幸的是,我似乎无法获得任何比赛。有什么建议吗?
答案 0 :(得分:1)
如果您的正则表达式与您希望它匹配的字符串不匹配,那么您的正则表达式是错误的。我已经纠正了你的正则表达式:
(\\w{3}) (\\d{1,2}) (\\d{2}):(\\d{2}):(\\d{2}).*SOFTLOADSERVICE;Install started\\s*
您可以在这里测试正则表达式和自己:
答案 1 :(得分:0)
虽然您还没有提供完整的示例,但您最近的修改建议您失败,因为您尝试匹配各行 - std::getline()
的结果,而您的模式涉及两行。
如果情况确实如此,您可能应该执行以下操作之一:
^
添加到正则表达式的开头,将$
添加到结尾(以便它在行边界上匹配,并使您的正则表达式与整个输入流匹配,而不是逐行匹配。