以下是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].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);
}
Run Code Online (Sandbox Code Playgroud)
您误解了后置条件信息,因为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给出了成功匹配的后置条件,因此条件应该只是"真实".
| 归档时间: |
|
| 查看次数: |
462 次 |
| 最近记录: |