以下是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()==在所有情况下都为真。如果函数返回false,则对参数m的影响未指定,除了m.size()返回0并且m.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);
}
答案 0 :(得分:5)
您误解了后置条件信息,因为C ++ 11标准(N3337)在该部分中包含冗余的措辞。
如果regex_search
返回false
,表示在输入字符串中找不到匹配项,则match_results
对象的状态未指定,除了成员函数{{1 }},返回match_results::ready
,true
,返回match_results::size
,0
,返回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
以外的[]
在匹配时有效。