【问题标题】:Returning a substring using Perl regex使用 Perl 正则表达式返回子字符串
【发布时间】:2011-10-17 18:39:52
【问题描述】:

我正在使用 Perl 并试图更好地理解它的子字符串/正则表达式功能。

假设我有一个字符串,例如

[48:31.8] 发送:>33*1311875297587*eval*0*frame[0]*"A"

并希望返回 1311875297587。它将始终采用该格式。我将如何使用 Perl 做到这一点?

谢谢

【问题讨论】:

  • 描述您如何识别感兴趣的部分。至少 3 位数长的数字字符串?从“>”之后的第 4 个字符开始? “*eval”之前的数字?等等……

标签: regex perl substring


【解决方案1】:

假设 "[48:31.8]..." 在 $string 中,那么:

my ($number) = $string =~ /\*(\d+)\*eval\*/;

如果字符串不匹配,$number 将未定义,否则它将包含"*""*eval*" 之间的数字。

【讨论】:

  • 我会在* 上输入split 并根据子字符串编号对其进行解析。更少的黑客攻击,更强大。
【解决方案2】:
if ($str =~ /\*(\d+)\*/ ) {
    print $1;
}

【讨论】:

    【解决方案3】:

    对于它的价值,我认为这是一个更可靠的答案:

    while(<STDIN>)
    {
        @fields = split(/\*/,$1) if(/(?<=>)([^<>])+(?><)/);
        print "$fields[1]\n";
    }
    

    这允许您在需要时访问所有字段,并且不依赖于固有顺序来解析特定字段。

    用您想要的任何逐行迭代替换while 循环。不过,为了进行测试,请将其作为 Perl 脚本运行,然后粘贴到您的行 [48:31.8] Sent: &gt;33*1311875297587*eval*0*frame[0]*"A"&lt; 或其他任何内容中。

    【讨论】:

      【解决方案4】:
      my ($num) = '>33*1311875297587*eval*0*frame[0]*"A"<' =~ /(\d{3,})/;
      print $num;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-08
        • 2018-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多