我无法让$(美元符号)按照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
我错过了什么?
答案 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与该测试用例不匹配。