Perl中如何用正则表达式正确解析字符串提取用户名、月份和时间
Perl正则提取字段修正方案
问题原因
你使用$``(正则匹配位置的前缀内容)提取用户名时, pts/匹配项前面的空格也属于前缀的一部分,会被一起存入$userName`变量,因此尾部带有多余空白。
修正方案
推荐使用单次正则匹配所有目标字段,逻辑更严谨,也自动规避空白问题:
# 示例输入 $_ = "username1 pts/1 75-30-120-13.lig Wed Oct 12 19:20 - 19:25"; # 匹配所有目标字段 if (/^(\S+)\s+.*?\b(\w{3})\s+\d+\s+(\d+):(\d+)\s*-\s*(\d+):(\d+)/) { my $userName = $1; my $month = $2; my $start_hour = $3; my $start_min = $4; my $end_hour = $5; my $end_min = $6; # 计算分钟级时长 my $duration_min = ($end_hour * 60 + $end_min) - ($start_hour * 60 + $start_min); # 测试输出 print "用户名:$userName\n"; print "月份:$month\n"; print "会话时长:$duration_min 分钟\n"; }
如果希望保留原有写法,只需要对提取到的用户名做尾部去空白处理即可:
$userName = "$`"; $userName =~ s/\s+$//; # 移除尾部所有空白字符
正则说明
^(\S+):匹配行首连续非空白字符,即无多余空格的用户名\b(\w{3}):匹配三个字母组成的月份单词,边界符避免误匹配- 时间部分的匹配逻辑兼容空格数量波动,鲁棒性更强
内容的提问来源于stack exchange,提问作者noscreen
相关产品推荐
相关产品推荐

