我在C ++中使用正则表达式做了一些工作,尝试了std :: regex和boost:regex(1.58.0)。
我得到了这个奇怪的比赛。这是代码:
#include <iostream>
#include <regex>
using namespace std;
int main(int argv, const char* argc[])
{
regex log_line_regex_(".+\\s(.+)$");
char* log_line = "06-29 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeState";
smatch matches;
if (regex_match(std::string(log_line), matches, log_line_regex_))
{
std::cout << "match: " << log_line << std::endl;
unsigned i;
for (i = 0; i < matches.size(); i++)
{
std::cout << "$" << i << ": " << std::string(matches[i].first, matches[i].second) << std::endl;
}
}
return 0;
}
结果是:
match: 06-29 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeState
$0: 06-29 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeSt`
$1: ModeSt`
请参阅?输出被破坏:(
正如我所说,我在Cygwin上尝试了boost 1.58.0
和g++ (GCC) 4.9.2
我发现在这个简单的正则表达式中boost :: regex失败是很奇怪的。那我的用法错了吗?
答案 0 :(得分:0)
这是实施的质量。
有两个问题在起作用:
大多数std库实现都没有完全或完全实现std::regex
。这是混淆的常见原因。 IIRC GCC仅从5.x起支持它。
另一个问题是您输入(std::string(log_line)
)是暂时的(!)。 smatch
将包含并将迭代器返回到临时符,该临时符的生命周期在regex_match
call1结束时结束。
修复它至少使这个工作在GCC 5.x:
<强> Live On Coliru 强>
#include <iostream>
#include <regex>
int main()
{
std::regex log_line_regex_(".+?\\s(.+)");
char const *log_line = "06-29 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeState";
std::smatch matches;
std::string input(log_line);
if (regex_match(input, matches, log_line_regex_))
{
std::cout << "match: " << log_line << std::endl;
for (unsigned i = 0; i < matches.size(); i++) {
std::cout << "$" << i << ": " << std::string(matches[i].first, matches[i].second) << std::endl;
}
}
}
打印:
match: 06-29 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeState
$0: 06-29 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeState
$1: 18:20:08.938 1031 1099 D WifiStateMachine: processMsgConnect oo ModeState
¹实际上包含完整表达