[英]How can I extract a file path from a Perl string?
我想从此字符串中找到具有全路径的文件名
"[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:
它与最后一个/
和最后一个匹配:
。 如何将其更改为first /
first :
?
在这种情况下,“粘合和伸展”是有用的。 您知道[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";
}
如果文件名不包含空格,则可以创建简单的正则表达式以匹配所有部分:
my ($file, $line, $msg) = ( $string_from_to_match =~ m{(\S+):([^:]+):([^:]+)} );
我用过:
\\S+
匹配1个或多个非空格符号 [^:]+
匹配1个或更多not :
符号 如果你想在道路空间,那么最好的办法是除去起始[exec]
由部分和分裂:
:
$string_from_to_match =~ s{^\[exec\]\s+}{};
my ($file, $line, $msg) = split(/:/, $string_from_to_match, 3);
您可以尝试:
#!/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
如果要匹配,为什么要使用split()
?
if ($subject =~ m!(/[^:]+):!) {
$result = $1;
} else {
$result = "";
}
应该这样做。
说明:
!
:替代正则表达式定界符(因为我需要/
内部)
(
:开始捕获组
/
:匹配一个/
。 这将始终是字符串的第一个/
。
[^:]+
:匹配1个或更多字符,但:
)
:结束捕获组
:
:匹配:
!
:正则表达式分隔符
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.