奇怪的正则表达式匹配行为。我的正则表达式错了吗?或者是编译器错误?

时间:2015-07-01 19:57:28

标签: regex c++11 boost cygwin

我在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.0g++ (GCC) 4.9.2

Compiled at Ideone also fails

我发现在这个简单的正则表达式中boost :: regex失败是很奇怪的。那我的用法错了吗?

1 个答案:

答案 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

¹实际上包含完整表达