如何从Perl字符串中提取文件路径?

时间:2010-09-21 14:16:46

标签: regex perl path

我想从此字符串中找到带有完整路径的文件名

"[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol"

我想提取

/snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java

我正在Perl中尝试这个

    $_=$string_from_to_match
    my @extract_file=split(/.*(\/.*)\:.*/);
    print $extract_file[1],"\n";`

但是我得到了这个输出:

/ClReportsHandler.java:233:

匹配上一个/和最后一个:。如何将其更改为第一个/和第一个:

5 个答案:

答案 0 :(得分:4)

这是“粘合和拉伸”有用的情况。您知道左边是[exec]后跟空格,右边是冒号后跟行号。你想要介于两者之间的东西:

#! /usr/bin/perl

use warnings;
use strict;

$_ = "[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol";

if (/\[exec\]\s*(.+?):\d+/) {
  print $1, "\n";
}

答案 1 :(得分:1)

如果您的文件名不包含空格,则可以创建简单的正则表达式以匹配所有部分:

my ($file, $line, $msg) = ( $string_from_to_match =~ m{(\S+):([^:]+):([^:]+)} );

我用过:

  • \S+匹配1个或多个非空格符号
  • [^:]+匹配1个或多个:个符号

如果您想要路径中的空格,那么最好的方法是删除起始[exec]部分并按:分割:

$string_from_to_match =~ s{^\[exec\]\s+}{};
my ($file, $line, $msg) = split(/:/, $string_from_to_match, 3);

答案 2 :(得分:1)

你可以尝试:

#!/usr/bin/perl
use strict;
use warnings;
use 5.10.1;

my $str = "[exec] /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java:233: cannot resolve symbol";
$str =~ s!^[^/]*(/[^:]*):.*$!$1!;
say $str;

输出继电器:     /snschome/sns/ccyp/mb_ccsns/bb/cbil5/v85_8/amdocs/iamcust/bil/cl/business/handlers/ClReportsHandler.java

答案 3 :(得分:0)

如果你想匹配,为什么要使用split()

if ($subject =~ m!(/[^:]+):!) {
    $result = $1;
} else {
    $result = "";
}

应该这样做。

说明:

!:替代正则表达式分隔符(因为我需要内部/

(:开始捕捉群组

/:匹配/。这将始终是字符串的第一个/

[^:]+:匹配除:

以外的1个或多个字符

):结束捕获组

::匹配:

!:正则表达式分隔符

答案 4 :(得分:-1)

这就是我所做的:

if ($fullpath =~ /^(.+)\/([^\/]+)/)
{
    my ($path, $file) = ($1, $2);
}

这是通过匹配除最后一个 / 之外的任何内容来工作的。这当然在 Windows 下可能不起作用。