量词

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