簡體   English   中英

regexec 不返回多個匹配項

[英]regexec does not return multiple matches

嘗試通過此示例學習 posix 正則表達式,請在此處輸入鏈接描述以及我自己的正則表達式和文本。

    const char * regex_text = "[[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3}";
    const char * find_text = "00:01:54,644 --> 00:01:56,714 --> 00:02:58,589";

輸出:

Trying to find '[[:digit:]]{2}\:[[:digit:]]{2}\:[[:digit:]]{2},[[:digit:]]{3}' in '00:01:54,644 --> 00:01:56,714 --> 00:02:58,589'
$& is '00:01:54,644' (bytes 0:12)
$& is '00:01:56,714' (bytes 17:29)
$& is '00:02:58,589' (bytes 34:46)
No more matches.

我的問題是為什么在每個for循環中只找到一個匹配項? 相反, while循環完成了這項工作。 一個regexec不應該將所有匹配項返回給m嗎?

for 循環將捕獲匹配項中的所有捕獲組(括在括號中的組)。 所以如果你寫了

([[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3}) --> ([[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3}) --> ([[:digit:]]{2}\\:[[:digit:]]{2}\\:[[:digit:]]{2},[[:digit:]]{3})

作為您的正則表達式,您的三個時間戳將顯示為 1 美元、2 美元和 3 美元。

但是,在您的代碼中,正則表達式僅匹配一個時間戳。 如果你想捕捉下一個,你需要執行一個新的匹配,這就是while循環所做的。

為了具體回答這個問題,對regexec()的單個調用只返回正則表達式的第一個匹配項是正常的,因此需要一個外循環來遍歷所有匹配項。

混淆來自這樣一個事實,即regmatch_t數組只描述了正則表達式的一個匹配項(is 是一個數組,因為它必須包含匹配項本身的偏移量,以及該匹配項中每個子表達式的偏移量)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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