[英]regex_search returns true, but regex_match returns empty match set
[英]Does zero match always “matches” when regex_search returns true?
以下是C ++ 11標准的一些引用:
28.11.3 regex_search [re.alg.search]
m
是match_results
類型的regex_search
的參數。
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);
}
您誤解了后置條件信息,因為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
:m[0].matched
的條件是“如果找到匹配則為true,否則為false”。 但表143給出了成功匹配的后置條件,因此條件應該只是“真實”。
表143泄漏了額外信息。
如果未找到匹配項,則m.size()
為零,因此m[0]
返回不匹配的子表達式(如0
> = m.size()
),在這種情況下m[0].matched
為false 。
如果找到匹配,則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()
之外的[]
在匹配時是有效的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.