当regex_search返回true时,零匹配总是"匹配"吗?

Pow*_*mer 4 c++ regex c++11

以下是C++ 11标准的一些引用:

28.11.3 regex_search [re.alg.search]

m是一种regex_search类型的论证match_results.

2 E ff ects:确定re是否是[first,last]中与正则表达式e匹配的某个子序列.参数标志用于控制表达式与字符序列的匹配方式.如果存在这样的序列,则返回true,否则返回false.

3后置条件:在所有情况下m.ready()== true.如果函数返回false,则对参数m的影响未指定,除了m.size()返回0并且m.empty()返回true.否则,表143中给出了对参数m的影响.

表143说明了以下内容m[0].matched:

如果找到匹配则为true,否则为false.

上述似乎暗示有可能regex_search返回true,并在同一时间m[0].matchedfalse.有人可以提供一个示例(正则表达式模式和文本匹配),显示何时可能?

换句话说,什么的价值观textre下面的程序将不能断言:

#include <regex>
#include <cassert>
int main()
{
    char re[] = ""; // what kind of regular expression must it be?
    char text[] = ""; // what kind of input text must it be?
    std::cmatch m;
    assert(std::regex_search(text, m, std::regex(re)) == true);
    assert(m[0].matched == false);
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*ian 5

您误解了后置条件信息,因为C++ 11标准(N3337)在该部分中包含冗余的措辞.

如果regex_search返回false,这意味着一个匹配的不输入字符串内的任何位置找到,则状态match_results对象是未指定的,除了成员函数match_results::ready,它返回true,match_results::size,它返回0,并且match_results::empty,该方法返回true.

match_results::operator[]在这种情况下,结果是未指定的,您不应该调用它.

另一方面,如果regex_search返回true,则意味着找到匹配,在这种情况下m[0].matched 将始终如此true.false在这种情况下,没有任何情况可以发生.

最新的N3936草案对此进行了澄清,该草案仅在表143中说明:

m [0].匹配| 真正

可以在此处查看导致此措辞更改的问题报告.引用它:

表143中有类似的探测:条件m[0].matched是"如果找到匹配则为true,否则为false".但表143给出了成功匹配的后置条件,因此条件应该只是"真实".