写 ref="/tag/2034/" style="color:#874873;font-weight:bold;">Perl 脚本处理文本时,正则表达式是绕不开的利器,而量词(Quantifiers)就是让正则“活起来”的关键——它告诉 Perl:某个字符或分组,到底要出现几次才匹配成功。
常见的 Perl 正则量词有哪些?
Perl 支持五种基础量词,它们都跟在字符、字符类或括号分组后面:
*:匹配 0 次或多次(贪婪)+:匹配 1 次或多次?:匹配 0 次或 1 次{n}:精确匹配 n 次{n,m}:匹配至少 n 次、最多 m 次
举个日常例子:提取邮箱用户名
比如你有一行日志:user=alice@example.com;status=active,想把 alice 提出来。可以这样写:
if ($line =~ /user=(\w+)@/) {
print "用户名是:$1\n";
}
这里的 \w+ 就是量词 + 的典型用法——匹配一个或多个字母/数字/下划线,直到遇到 @ 停下。
小心贪婪匹配:* 和 + 默认吃太饱
看这个字符串:"abc123def456ghi",如果用 /\d+/,会分别匹配到 123 和 456;但换成 /\d.*/,它就会从第一个 1 一直吃到末尾,得到 123def456ghi——因为 .* 默认“贪心”,尽可能多匹配。
想让它“知足”,加个 ? 变成非贪婪模式:/\d.*?/,这时它就会在第一个 1 后面马上停住(虽然结果仍是 1,但逻辑变了)。
精确控制次数:用花括号更稳当
验证手机号后四位是否全是数字且不多不少?/\d{4}$/ 比 /\d+$/ 更靠谱;检查日期格式 2024-05-12 中的月份部分,/-(0[1-9]|1[0-2])-/ 配合 {2} 也能写成 /-(\d{2})-/,再加校验逻辑更清晰。
常见组合实战
匹配中文 Windows 路径中的文件名(不含扩展名):/\\([^\\]+)\.\w+$/
其中 [^\\]+ 表示“一个或多个非反斜杠字符”,+ 确保至少有一个字符,避免空匹配。
清理日志里连续多个空格为单个空格:$log =~ s/ +/ /g;
这里 + (空格后跟 +)就靠量词搞定。