【问题标题】:Perl - Unexptected behaviour with Regex in ArrayPerl - 数组中正则表达式的意外行为
【发布时间】:2013-11-15 09:20:38
【问题描述】:

我正在尝试匹配具有

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

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

提前感谢您的建议。

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

【问题讨论】:

  • 你应该试试File::Find 模块。
  • 看来正则表达式匹配你想要的 - 因为你说它必须在 main/ 之后有 ANY_NUMBER 而你的不匹配行没有 main/ANY_NUMBER ...
  • 没错,但无论如何我都必须使用专有的“cleartool”命令,所以我很快将它与 find-command 一起使用。将查看 File::Find,艰难。
  • @ring0: 它打印 /foldera/folderb/folderc/folderd/file.ext@@/main/5 (RLT-abcde, BLD-abcde, DEV-abcde) 但我需要 /foldera/文件夹b/folderc/folderd/file.ext@@/main/5

标签: regex arrays perl filter


【解决方案1】:

改变

print $file;

到:

print "$MATCH\n";

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

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

【讨论】:

  • 当我这样做时,它会完全过滤掉 /foldera/folderb/folderc/folderx/file12.ext@@/main/6 (RLS-abcde-5.0, RLS-abcde-4.1) 但我想要/foldera/folderb/folderc/folderx/file12.ext@@/main/6
  • 问题是你打印的是整行,而不仅仅是正则表达式匹配的那部分。
  • 既然我理解了这个问题,就更新了答案。
  • 是的,当然!你说的对!我可以为此扇自己耳光!谢谢!! ;)
【解决方案2】:

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

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

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

或者我个人会这样写:

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

希望这会有所帮助!

【讨论】:

  • 他不想要没有编号的行。
【解决方案3】:

快速浏览一下

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

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

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

【讨论】:

  • 这种行为是需要的,我不想要 /foldera/folderb/folderc/folderd/file.ext@@/main,就像我上面写的那样。
猜你喜欢
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 2013-01-14
  • 2019-11-03
  • 2012-07-16
  • 2022-06-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多