量詞
假設我們將 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}
匹配; 當它不能正規表示式失敗時,沒有進行回溯跟蹤以檢視之前的 .*
調整是否允許匹配。