2010-09-21 191 views
1

我想從這個字符串如何從Perl字符串中提取文件路徑?

"[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 

找到FULLPATH的文件名,我在Perl

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

想這一點,但我得到此輸出:

/ClReportsHandler.java:233: 

它匹配最後的/和最後的:。我怎樣才能將其更改爲第一個/和第一個:

+3

請編輯格式化的版本,而不是回滾到未格式化的版本。否則你的問題是不可讀的。 – 2010-09-21 14:29:11

回答

0

爲什麼你要使用split()如果你想匹配?

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

應該這樣做。

說明:

!:備選的正則表達式定界符(因爲我需要內部的/

(:開始捕獲組

/:匹配/。這將始終是字符串的第一個/

[^:]+:匹配1個或多個字符,除了:

):結束捕獲組

::如果你的文件名沒有正則表達式的分隔符

+0

來自downvoter的任何評論? – 2010-09-21 20:43:14

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); 
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"; 
} 
+0

嗨它工作從你的正則表達式我改變了我的這個&它工作正常..我的

@extract_file=split(/.*?(\/.*?)\:.*/);
2010-09-21 14:44:29

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 /業務/處理程序/ ClReportsHandler.java

相關問題