ref="/tag/2/" style="color:#874873;font-weight:bold;">Perl正则匹配的基本语法
Perl的正则表达式是文本处理的利器,尤其适合日志分析、数据清洗这类任务。最基本的匹配操作符是 m//,比如判断一段文本中是否包含“error”:
if ($text =~ m/error/) {
print "发现错误信息\n";
}
这里的 =~ 是绑定操作符,表示将左边的变量与右边的正则进行匹配。m// 中的斜杠可以换成其他分隔符,比如 m{} 或 m||,避免和内容中的斜杠冲突。
常用修饰符说明
实际工作中,大小写往往不敏感。比如日志里的“Error”、“ERROR”都该被识别。这时加上 i 修饰符就能忽略大小写:
if ($log_line =~ m/error/i) {
print "匹配到错误关键词\n";
}
如果要匹配多行内容,比如一段HTML中找某个标签,可以用 s 修饰符让点号(.)也能匹配换行符,再配合 g 实现全局查找。
提取数据:捕获组的使用
正则不只是用来判断有没有,更多时候是要“抓”出想要的部分。用括号 () 可以定义捕获组。比如从一段日志中提取时间戳:
$log = "[2024-05-12 14:23:10] User login failed";
if ($log =~ m/\[(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2})\]/) {
print "时间:$1\n"; # $1 表示第一个捕获组
}
这段代码会输出:时间:2024-05-12 14:23:10。捕获的内容会自动存入 $1、$2 等变量中,非常方便。
替换操作:s/// 的实用场景
除了匹配,替换也是高频需求。比如清理用户输入中的多余空格:
$input = " username is jack ";
$input =~ s/\s+/ /g; # 多个空白符替换成一个空格
$input =~ s/^\s+|\s+$//g; # 去除首尾空格
print "处理后:'$input'\n"; # 输出:'username is jack'
这里用了两次替换,第一次合并空格,第二次去掉两端空格。这种组合操作在表单处理中很常见。
常见特殊字符与模式
掌握一些常用模式能大幅提升效率:
\d匹配数字,\w匹配字母数字下划线*表示零次或多次,+表示一次或多次^匹配行首,$匹配行尾
比如验证一个简单的IP地址段:
if ($ip =~ m/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/) {
print "格式像IP地址\n";
}
虽然这不能完全校验合法性,但作为初步筛选足够用了。
非贪婪匹配:避免过度捕获
默认情况下,正则会尽可能多地匹配内容。比如从HTML中提取第一个标签内的文字:
$html = "<p>第一段</p><p>第二段</p>";
if ($html =~ m/<p>(.*)<\/p>/) {
print "提取内容:$1\n"; # 会输出“第一段</p><p>第二段”
}
这是因为 .* 贪婪地吞掉了所有内容。改成非贪婪模式,在量词后加个问号:
if ($html =~ m/<p>(.*?)<\/p>/) {
print "提取内容:$1\n"; # 正确输出“第一段”
}
这样就能精准匹配到第一个闭合标签。