簡體   English   中英

當regex_search返回true時,零匹配總是“匹配”嗎?

[英]Does zero match always “matches” when regex_search returns true?

以下是C ++ 11標准的一些引用:

28.11.3 regex_search [re.alg.search]

mmatch_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].matchedfalse 有人可以提供一個示例(正則表達式模式和文本匹配),顯示何時可能?

換句話說,什么值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 ,它返回truematch_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].matchedm[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM