#include <regex>
int main()
{
b = std::regex_match("building", std::regex("^\w*uild(?=ing$)"));
//
// b is expected to be true, but the actual value is false.
//
}
我的编译器是clang 3.8。
为什么std :: regex_match不支持“零长度断言”?
最佳答案
regex_match仅用于匹配整个输入字符串。您的正则表达式-正确写为"^\\w*uild(?=ing$)
并带有反斜杠转义,或者写为raw string R"(^\w*uild(?=ing$))"
,实际上仅匹配(使用)前缀build
。它会先查找ing$
,并会成功找到它,但是由于未使用整个输入字符串,因此regex_match拒绝匹配。
如果要使用regex_match但仅捕获第一部分,则可以使用^(\w*uild)ing$
(或仅(\w*uild)ing
,因为必须匹配整个字符串)并访问第一个捕获组。
但是由于无论如何都使用^
和$
,因此最好使用regex_search代替:
int main()
{
std::cmatch m;
if (std::regex_search("building", m, std::regex(R"(^\w*uild(?=ing$))"))) {
std::cout << "m[0] = " << m[0] << std::endl; // prints "m[0] = build"
}
return 0;
}
关于c++ - 为什么std::regex_match不支持“零长度断言”?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42037232/