我的Boost正则表达式不匹配任何东西

时间:2018-04-20 18:18:38

标签: c++ regex boost

我试图匹配看起来像这样的字符串:

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;
    }

不幸的是,我似乎无法获得任何比赛。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

如果您的正则表达式与您希望它匹配的字符串不匹配,那么您的正则表达式是错误的。我已经纠正了你的正则表达式:

(\\w{3}) (\\d{1,2}) (\\d{2}):(\\d{2}):(\\d{2}).*SOFTLOADSERVICE;Install started\\s*

您可以在这里测试正则表达式和自己:

https://regex101.com/

https://www.regextester.com/

https://regexr.com/

答案 1 :(得分:0)

虽然您还没有提供完整的示例,但您最近的修改建议您失败,因为您尝试匹配各行 - std::getline()的结果,而您的模式涉及两行。

如果情况确实如此,您可能应该执行以下操作之一:

  • 匹配连续线对(即每次迭代尝试匹配前一个+当前线)
  • 将正则表达式拆分为2个正则表达式,每行一个。现在,只要一行与第一个正则表达式匹配,尝试将下一行与第二行匹配;否则尝试将它与第一个匹配。
  • ^添加到正则表达式的开头,将$添加到结尾(以便它在行边界上匹配,并使您的正则表达式与整个输入流匹配,而不是逐行匹配。