簡體   English   中英

如何從Perl字符串中提取文件路徑?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM