这是实现上的bug。不仅我尝试过的其他几个工具也认为您的模式与输入不匹配,而且我还尝试了以下内容:
#include <string>
#include <regex>
#include <iostream>
int main()
{
std::string pattern("([a-z]*)([a-z])(e)(i)([a-z]*)");
std::regex r(pattern);
std::smatch results;
std::string test_str = "cei";
if (std::regex_search(test_str, results, r))
{
std::cout << results.str() << std::endl;
for (size_t i = 0; i < results.size(); ++i) {
std::ssub_match sub_match = results[i];
std::string sub_match_str = sub_match.str();
std::cout << i << ": " << sub_match_str << '\n';
}
}
}
这与您之前的类似,但我将[:alpha:]
替换为 [a-z]
以简化操作。我还暂时将[^c]
替换为[a-z]
,因为这似乎可以使其正常工作。这是它在Linux x86-64上的GCC 4.9.0的输出结果:
cei
0: cei
1:
2: c
3: e
4: i
5:
如果我将你的 [^c]
替换为 [a-z]
,并在那里放上 f
,它会正确地显示模式不匹配。但是如果我像你一样使用 [^c]
:
std::string pattern("([a-z]*)([^c])(e)(i)([a-z]*)")
然后我得到了这个输出:
cei
0: cei
1: cei
terminate called after throwing an instance of 'std::length_error'
what(): basic_string::_S_create
Aborted (core dumped)
因此,它声称匹配成功,results[0]是"cei",这是预期的。然后,results[1]也是"cei",我想这可能是可以的。但是,results[2]会崩溃,因为它尝试使用begin=nullptr构造长度为18446744073709551614的std::string。那个巨大的数字恰好是2 ^ 64-2,也就是std::string :: npos-1(在我的系统上)。所以我认为某个地方有一个偏移量错误,其影响可能远不止一个虚假的正则表达式匹配 - 它可能会在运行时崩溃。
boost
。 - Yue Wang[[:alpha:]]*
会吃掉所有字符。然后,匹配器就没有剩下的cei
,因为它已经在末尾了。通过回溯,字符串应该能够匹配... - rubber boots