You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.16 23:15:03