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

Does zero match always "matches" when regex_search returns true?

本文关键字:零匹 是否 matches search regex 返回 true      更新时间:2023-10-16

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

28.11.3 regex_search [re.al .search]

mmatch_results类型的regex_search的一个参数。

2效果:确定re是否为[first,last)中匹配正则表达式e的子序列。参数flags用于控制如何根据字符序列匹配表达式。如果存在这样的序列返回true,否则返回false。

3后置条件:m.ready()在所有情况下== true。如果函数返回false,则对参数m的影响是未指定的,除了m.size()返回0和m.s 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);
}

您误解了后置条件信息,因为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]。匹配| true

引起这一措辞变化的问题报告可以在这里查看。引用它:

在表143中有一个类似的问题:m[0].matched的条件是"如果找到匹配,则为true,否则为false"。但是表143给出了成功匹配的后置条件,因此条件应该简单地为"true"。

表143泄露了额外的信息。

如果没有找到匹配,则m.size()为零,因此m[0]返回未匹配的子表达式(如0>= m.size()),在这种情况下m[0].matched为假。

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

如果他们声明" m[0].matched "总是为真,那么对表143的引用仍然为真(因为引用只在存在匹配时发生),但这会过于混乱。

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