正则表达式在C ++中表现不同

时间:2017-11-11 12:06:10

标签: c++ regex mingw

我编写了一个正则表达式,用于按以下格式解析日志字符串的各种元素:

  

0 |冗长|常规|记录系统已初始化

     

0 |冗长|主题|启动线程......

     

0 |冗长|主题|等待线程完成...

表达式:

regex rg(R"(\s*(\d+)\|\s*([a-zA-Z]+)\|\s*([a-zA-Z]+)\|\s*([a-zA-Z\s]+))");

在线测试人员(例如https://regexr.com/)中,按预期工作。

但是,当我在C ++程序中使用它时,它将按如下方式拆分第一个日志字符串:

  

0

     

|冗长|常规|

     

登录

     

系统

我尝试过使用各种std :: regex_constant参数(例如扩展,基本,ECMAScript),但没有成功。

为什么会发生这种情况/我做错了什么?我是Regex的新手

1 个答案:

答案 0 :(得分:0)

日晚和美元短暂(:-( ...(:-),但是:

#include <iostream>
#include <regex>
#include <string>

using namespace std;

int main(int argc, char *argv[]) {
    string str = "0|Verbose|General| Logging system initialised";
    regex rg(R"(\s*(\d+)\|\s*([a-zA-Z]+)\|\s*([a-zA-Z]+)\|\s*([a-zA-Z\s]+))");
    smatch match;

    if (regex_match(str, match, rg)) {
        cout << "is a match" << endl;
        int nSubs = match.size();
        for (int i = 1; i < nSubs; i++) {
            cout << i << ": " << match[i] << endl;
        }
    } else {
        cout << "not a match" << endl;
    }
}

输出:

[test]: ./re1
is a match
1: 0
2: Verbose
3: General
4: Logging system initialised
[test]: 

使用:

[test]: g++ --version
g++ (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

[test]: