Perl正则匹配用法详解:文本处理不再难

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";  # 正确输出“第一段”
}

这样就能精准匹配到第一个闭合标签。