量詞

假設我們將 const string input 作為要驗證的電話號碼。我們可以從需要一個零或更多量詞的數字輸入開始 :regex_match(input, regex("\\d*"))一個或多個量詞regex_match(input, regex("\\d+")) 但是如果 input 包含一個無效的數字字串,它們都真的不足:123 讓我們使用一個或多個量詞確保我們至少獲得 7 位數字:

regex_match(input, regex("\\d{7,}"))

這將保證我們將至少獲得一個電話號碼,但 input 也可能包含一個太長的數字字串,如:123456789012。因此,讓我們使用 **n 和 m 量詞,**因此 input 至少為 7 位但不超過 11​​位:

regex_match(input, regex("\\d{7,11}"));

這讓我們更接近,但仍然接受[7,11]範圍內的非法數字字串,例如:123456789 因此,讓我們使用惰性量詞使國家程式碼可選 :

regex_match(input, regex("\\d?\\d{7,10}"))

重要的是要注意,惰性量詞匹配儘可能少的字元,因此匹配此字元的唯一方法是,如果已經有 10 個字元與\d{7,10} 匹配。 (為了貪婪地匹配第一個角色,我們不得不這樣做:\d{0,1}。) 延遲量詞可以附加到任何其他量詞。

現在,我們如何使區號成為可選區域*,*只有區域程式碼存在時才接受國家程式碼?

regex_match(input, regex("(?:\\d{3,4})?\\d{7}"))

在這個最終的正規表示式中,\d{7} 需要 7 位數。這 7 位數字可選地以 3 或 4 位數字開頭。

請注意,我們沒有新增延遲量詞\d{3,4}?\d{7}\d{3,4}? 將匹配 3 或 4 個字元,更喜歡 3.相反,我們將非捕獲組匹配最多一次,而不是匹配。如果 input 不包括區號如 1234567,則會導致不匹配。

在量詞主題的結論中,我想提到你可以使用的另一個附加量詞,即佔有量詞任一所述懶惰量詞所有格量詞可以被附加到任何量詞。該佔有慾量詞的唯一功能是告訴它協助正規表示式引擎,貪婪地把這些字元*,也不要放棄他們,即使它會導致正規表示式失敗*。這例如沒有多大意義:regex_match(input, regex("\\d{3,4}+\\d{7})) 因為 input 喜歡:1234567890 不會匹配,因為\d{3,4}+將始終匹配 4 個字元,即使匹配 3 將允許正規表示式成功。
佔有慾量詞最好在量化標記限制可匹配字元數時使用。例如:

regex_match(input, regex("(?:.*\\d{3,4}+){3}"))

如果 input 包含以下任何內容,則可用於匹配:

123 456 7890
123-456-7890 (123)
456-7890
(123)456 - 7890

但是當這個正規表示式真正閃耀時,input 包含非法輸入:

12345 - 67890

如果沒有佔有量詞,正規表示式引擎必須返回並測試 *.*和 3 或 4 個字元的每個組合,*看它是否能找到匹配的組合。使用佔有量詞,正規表示式從 第二個 佔有量詞停止,‘0’字元開始,正規表示式引擎嘗試調整 .*以允許\d{3,4} 匹配; 當它不能正規表示式失敗時,沒有進行回溯跟蹤以檢視之前的 .*調整是否允許匹配。