早上打开电脑,准备整理上周的运动步数记录。这些数据藏在一堆文本日志里,全是日期和数字混在一起。手动一条条找太费劲,这时候想到用 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 代码加一个正则表达式,省时又省力。