2010-09-21 72 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

相关问题