这是 libstdc++ 实现中的一个错误。观看这些:
#include <string>
#include <regex>
#include <boost/regex.hpp>
#include <iostream>
int main() {
{
using namespace std;
regex my_r("(.*)(6)(.*)");
smatch m;
if (regex_match(std::string{"123456789"}, m, my_r)) {
std::cout << m.length(1) << ", "
<< m.length(2) << ", "
<< m.length(3) << std::endl;
}
}
{
using namespace boost;
regex my_r("(.*)(6)(.*)");
smatch m;
if (regex_match(std::string{"123456789"}, m, my_r)) {
std::cout << m.length(1) << ", "
<< m.length(2) << ", "
<< m.length(3) << std::endl;
}
}
return 0;
}
如果使用 gcc 编译,第一个(libstdc++)返回完全错误的结果9、-2、4,第二个(boost 的实现)按预期返回5、1、3 。
如果您使用 clang + libc++ 编译,您的代码可以正常工作。
(请注意,libstdc++ 的正则表达式实现仅“部分支持”,如http://gcc.gnu.org/bugzilla/show_bug.cgi?id=52719中所述。)