我想从此字符串中找到带有完整路径的文件名
"[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:
匹配上一个/
和最后一个:
。如何将其更改为第一个/
和第一个:
?
答案 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 = "";
}
应该这样做。
说明:
!
:替代正则表达式分隔符(因为我需要内部/
)
(
:开始捕捉群组
/
:匹配/
。这将始终是字符串的第一个/
。
[^:]+
:匹配除:
)
:结束捕获组
:
:匹配:
!
:正则表达式分隔符
答案 4 :(得分:-1)
这就是我所做的:
if ($fullpath =~ /^(.+)\/([^\/]+)/)
{
my ($path, $file) = ($1, $2);
}
这是通过匹配除最后一个 / 之外的任何内容来工作的。这当然在 Windows 下可能不起作用。