正则表达式量词

*、+、?、{n,m} 等指定重复次数的元字符,控制前一个元素的出现次数。

正则表达式量词 (Quantifier) 是指定前一个模式元素重复次数的元字符。基本量词包括 * (0 次或多次)、+ (1 次或多次)、? (0 次或 1 次)、{n} (恰好 n 次)、{n,} (n 次或更多) 和 {n,m} (n 到 m 次)。

量词有两种模式:默认的"贪婪"模式和添加 ? 后的"惰性"模式。贪婪模式尽可能多地匹配字符,惰性模式尽可能少地匹配。例如,对于字符串"<b>粗体</b>和<b>强调</b>",<b>.*</b> (贪婪) 匹配整个字符串,而 <b>.*?</b> (惰性) 只匹配"<b>粗体</b>"。查找生发剂 (Amazon)解释了贪婪匹配和惰性匹配的区别。

实际应用中,/\d{3}-\d{4}/ 匹配邮政编码格式,/[a-zA-Z]{2,}/ 匹配 2 个字符以上的英文单词。在表单验证中,{n,m} 可以限制字符数范围。例如,将用户名限制为 3-20 个字符可以使用 /^[a-zA-Z0-9_]{3,20}$/

使用量词时的一个重要注意事项是灾难性回溯 (ReDoS: Regular Expression Denial of Service)。像 (a+)+ 这样嵌套的量词在匹配失败时可能需要指数级的时间。对用户输入应用正则表达式时,建议预先验证模式的安全性或设置执行超时。

在 JavaScript 中,关于独占量词 (possessive quantifier) 的讨论正在推进,未来可能引入 *+++ 等抑制回溯的语法。目前,某些语言提供原子组 (?>...) 来实现类似效果。查找利口酒 (Amazon)介绍了 ReDoS 防范措施。

在字符计数方面,量词直接支持字符数限制验证。{n,m} 指定输入字符数范围,用于表单验证和数据库列长度检查。此外,\s+ 检测连续空白进行规范化,使量词成为文本预处理不可或缺的工具。

分享这篇文章