C ++ 11正则表达式行尾不匹配

时间:2014-02-10 22:47:34

标签: c++ regex c++11

我无法让$(美元符号)按照C ++ 11正则表达式中的说明工作。这是使用ECMAScript语法(默认)。

示例(regex.cc):

#include <iostream>
#include <regex>

int main() {
    if ( std::regex_search("one\ntwo", std::regex{"one$"}) ) {
        std::cout << "Should match, doesn't." << std::endl;
    }

    if ( std::regex_search("one\ntwo", std::regex{"two$"}
                         , std::regex_constants::match_not_eol) ) {
        std::cout << "Shouldn't match, does." << std::endl;
    }

    return 0;
}

预期产量:     应该匹配,不是。

实际输出:     不应该匹配,确实。

来自http://www.cplusplus.com/reference/regex/ECMAScript/

  

$ - 行尾 - 它是目标序列的结尾,或者在行终止符之前。

来自http://www.cplusplus.com/reference/regex/regex_search/

  

match_not_eol - 不是行尾 - 最后一个字符不被视为行尾("$"不匹配)。

在FreeBSD 10上使用Clang 3.3和3.4进行测试:

clang++ -std=c++11 -stdlib=libc++ -o regex regex.cc && ./regex

我错过了什么?

1 个答案:

答案 0 :(得分:5)

看起来你偶然发现了LWG issue 2343

引用,

  

如果Multiline为true,则$恰好在LineTerminator之前匹配。

     

如果Multiline为false,则$恰好在LineTerminator之前匹配。

[,,,]

  

现有实施的多行如下:

     

多= FALSE:

     

libstdc ++ r206594

     

libc ++ r199174

     

多= TRUE:

     

Visual Studio Express 2013

     

提升1.55

注意:使用当前SVN版本的libc++,您的第一个测试IS实际上是匹配的,所以看起来这个LWG问题将在Multiline中得到解决

第二个问题(忽略match_not_eol)看起来像一个相当简单的实现错误。 Boost.regex与该测试用例不匹配。