量词
假设我们将 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}
匹配; 当它不能正则表达式失败时,没有进行回溯跟踪以查看之前的 .*
调整是否允许匹配。