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

时间:2014-08-01 17:29:55

标签: c++ regex c++11

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

  

28.11.3 regex_search [re.alg.search]

mregex_searchmatch_results的参数。

  

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

     

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

表143列出了以下关于m[0].matched

的内容
  

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

上述内容似乎意味着regex_search可以返回true,同时m[0].matched可以false。有人可以提供一个示例(正则表达式模式和文本匹配),以显示何时可能?

换句话说,以下程序的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);
}

2 个答案:

答案 0 :(得分:5)

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

如果regex_search返回false,表示在输入字符串中找不到匹配项,则match_results对象的状态未指定,除了成员函数{{1 }},返回match_results::readytrue,返回match_results::size0,返回match_results::empty

true的结果在这种情况下未指定,您不应该调用它。

另一方面,如果match_results::operator[]返回regex_search,则表示找到了匹配项,在这种情况下,true 始终为m[0].matched 。在这种情况下,不存在true的情况。

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

  

m [0]。匹配|真

导致此措辞更改的问题报告可以是viewed here。引用它:

  

表143中有类似的探测:false的条件是“如果找到匹配则为真,否则为假”。但表143给出了成功匹配的后置条件,因此条件应该只是“真实”。

答案 1 :(得分:1)

表143泄露了额外信息。

如果未找到匹配项,则m.size()为零,因此m[0]会返回不匹配的子表达式(0&gt; = m.size()),其中案例m[0].matched是错误的。

如果找到匹配项,则m.size()非零,因此m[0]是整个匹配的表达式,因此m[0].matched为真。如果m.size()大于1,则m[i]的{​​{1}}是正则表达式匹配的子表达式。

如果他们说“i<m.size()”总是为真,那么对表143的引用仍然是正确的(因为引用仅在匹配时发生),但它会过于混乱。

如果您检查m[0].matched(28.10 / 4),您会发现与大多数容器不同,访问re.results以外的[]在匹配时有效。