当regex_search返回 true 时,零匹配是否总是"matches"?
Does zero match always "matches" when regex_search returns true?
以下是c++ 11标准中的一些引用:
28.11.3 regex_search [re.al .search]
m
是match_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
。有人可以提供一个例子(正则表达式模式和文本匹配),显示什么时候是可能的?
换句话说,对于text
和re
的哪些值,下面的程序不会断言:
#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()
之外访问[]
在匹配上是有效的。
- 是否可以对零模板参数进行模板专门化
- 是否可以在 QAbstractItemModel 中返回正数行数和零列数?
- 如果我们通过引用传递变量,则递归中使用的堆栈空间量是否为零?
- 在实践中,在运行时为零的乘法中是否有任何"lazy"评估
- 是否可以保证按字节的零 int 是零的表示形式?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- 是否允许向空指针添加零?
- 是否可以在C++中拼接缓冲区,零拷贝?
- std::unordered_map 运算符 [] 是否对非现有密钥进行零初始化?
- 非 constexpr 变量模板的开销是否为零?
- 列表初始化是否将原子初始化为零
- 结构成员指针是否自动初始化为零?
- 向量的大小是否有可能为 1 但其中的元素数量为零?
- make_shared是否对每个成员变量执行默认初始化(零初始化)
- 使用 C++ GMock 匹配器测试unordered_map的密钥是否来自一组密钥
- 是否可以保证输入<Type>实数时复杂对象的虚部设置为零?
- Visual Studio 2010 是否执行零初始化
- std::d iscrete_distribution() 是否允许零权重
- 如果输入大于零,是否有一行用于从输入中减去 1
- 当regex_search返回 true 时,零匹配是否总是"matches"?