Perl - 在阵列中使用Regex的意外行为

时间:2013-11-04 17:09:40

标签: regex arrays perl filter

我正在尝试匹配

的行
"/foldera/folderb/folderc/folderd/file.ext@@/main" + "/" + ANY_NUMBER:

所以例如:

(.+)(main)(.\d)

行:

/foldera/folderb/folderc/folderd/file.ext@@/main
/foldera/folderb/folderc/folderd/file.ext@@/main/0
/foldera/folderb/folderc/folderd/file.ext@@/main/1
/foldera/folderb/folderc/folderd/file.ext@@/main/2
/foldera/folderb/folderc/folderd/file.ext@@/main/3
/foldera/folderb/folderc/folderd/file.ext@@/main/4
/foldera/folderb/folderc/folderd/file.ext@@/main/5 (RLT-abcde, BLD-abcde, DEV-abcde)
/foldera/folderb/folderc/folderx/file12.ext@@/main/0
/foldera/folderb/folderc/folderx/file12.ext@@/main/1
/foldera/folderb/folderc/folderx/file12.ext@@/main/2
/foldera/folderb/folderc/folderx/file12.ext@@/main/3
/foldera/folderb/folderc/folderx/file12.ext@@/main/4
/foldera/folderb/folderc/folderx/file12.ext@@/main/5
/foldera/folderb/folderc/folderx/file12.ext@@/main/6 (RLS-abcde-5.0, RLS-abcde-4.1)

虽然我的正则表达式匹配了所需的行(我在http://www.regexe.com/检查了它),但是在我的Perl程序中它不匹配

/foldera/folderb/folderc/folderd/file.ext@@/main

但确实匹配:

/foldera/folderb/folderc/folderd/file.ext@@/main/5 (RLT-abcde, BLD-abcde, DEV-abcde)

以下是代码:

use warnings;
use strict;

my @file_list = `find /folder -type f -name '*.ext'|xargs cleartool lsvtree -all`;

foreach my $file(@file_list){

  if ($file=~m/(.+)(main)(.\d)/g){ 
   print $file;
  }
}

我很确定我犯了一个愚蠢的错误某个地方,但我只是看不到它!

提前感谢您的建议。

P.S。我在Perl 5.8和Perl 5.18下尝试了相同的结果,操作系统是Solaris。

3 个答案:

答案 0 :(得分:1)

更改

print $file;

为:

print "$MATCH\n";

因此您只打印与正则表达式匹配的行的部分。

您还应将\d更改为\d+,以允许包含多个数字的数字。

答案 1 :(得分:0)

快看之后

/foldera/folderb/folderc/folderd/file.ext @@ /主

最后没有号码。并且\ d需要数字; - )

您可能还会发现此网站有用:http://regexpal.com/

答案 2 :(得分:0)

我认为不符合您的行,因为您的正则表达式明确地在末尾寻找数字

尝试将正则表达式更改为:(注意末尾的curley括号)

(+)(主要)(\ d){0,1}

或者我个人会这样写:

(。*?)主(\ / \ d *){0,1}

希望这有帮助!