0

我正在尝试匹配具有

"/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;
  }
}

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

预先感谢您的建议。

PS 我在 Perl 5.8 和 Perl 5.18 下尝试过,结果相同,操作系统是 Solaris。

4

3 回答 3

1

改变

print $file;

至:

print "$MATCH\n";

所以你只打印与正则表达式匹配的那部分行。

您还应该更改\d\d+, 以允许多于一位的数字。

于 2013-11-04T17:19:21.023 回答
0

我认为与您的行不匹配,因为您的正则表达式最后明确地寻找一个数字

尝试将您的正则表达式更改为:(注意最后的花括号)

(.+)(main)(.\d){0,1}

或者我个人会这样写:

(.*?)main(\/\d*){0,1}

希望这可以帮助!

于 2013-11-04T17:34:12.917 回答
0

快速浏览后

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

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

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

于 2013-11-04T17:15:19.327 回答