知用堂
第二套高阶模板 · 更大气的阅读体验

Perl正则匹配数字:实用技巧与生活中的小应用

发布时间:2026-01-01 05:41:24 阅读:235 次

早上打开电脑,准备整理上周的运动步数记录。这些数据藏在一堆文本日志里,全是日期和数字混在一起。手动一条条找太费劲,这时候想到用 ref="/tag/2034/" style="color:#8B0506;font-weight:bold;">Perl 写个小脚本,把所有数字轻松抓出来。关键就是——正则匹配数字。

最基础的数字匹配

如果只想找出文本里的单个数字,可以用 \d。它代表任意一个数字字符,相当于 [0-9]。

my $text = "今天走了8562步,消耗了321卡路里";
while ($text =~ /(\d+)/g) {
    print "找到数字: $1\n";
}

这段代码会依次输出 8562 和 321。这里的 \d+ 表示“一个或多个数字”,加上括号就能捕获内容,$1 就是取到的值。

匹配特定格式的数字

有时候不是所有数字都要。比如你只关心超过1000步的数据,可以限定位数。

my $log = "周一: 743步, 周二: 1089步, 周三: 1201步";
while ($log =~ /(\d{4,})/g) {
    print "达标步数: $1\n";
}

\d{4,} 意思是四位及以上数字,这样就只抓出1089和1201,跳过不足千的记录。

带小数的价格也能处理

周末去超市买了些水果,发票是纯文本。想统计花了多少,但价格都带小数点。别担心,正则一样能搞定。

my $receipt = "苹果 12.8元 香蕉 6.5元 橙子 9.9元";
while ($receipt =~ /(\d+\.\d+)/g) {
    print "单项消费: $1 元\n";
}

这里 \d+\.\d+ 能匹配像 12.8 这样的数字。注意小数点要写成 \.,因为 . 在正则里有特殊含义,必须转义。

排除干扰项:不是所有数字都算

有时文本里夹着电话号码、年份,容易误抓。比如这句:“2024年买了第3件健身服,快递单号1029384756”。其实只想提取“第3件”里的3。

my $sentence = "2024年买了第3件健身服,快递单号1029384756";
if ($sentence =~ /第(\d+)件/) {
    print "购买序号: $1\n";
}

通过上下文限定“第…件”,就能精准定位目标数字,避免抓到年份或长串编号。

这些小技巧用熟了,日常处理文本数据就不再头疼。不管是记账、统计运动量,还是整理购物清单,几行 Perl 代码加一个正则表达式,省时又省力。