我编写了一个正则表达式,用于按以下格式解析日志字符串的各种元素:
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的新手
答案 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]: