[英]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.