Perl Regex要一个不是以特殊字符开头的单词_

时间:2013-08-27 07:36:55

标签: regex perl

我希望perl正则表达式从以下输出中获取单词:

Process Completed;Result= Volume in drive D has no label.

 Volume Serial Number is 328A-C899

 Directory of D:\Program

07/14/2013  12:09 PM    <DIR>          .
07/14/2013  12:09 PM    <DIR>          ..
06/16/2013  01:07 PM    <DIR>          IPS
07/14/2013  12:10 PM    <DIR>          IPS1
07/14/2013  12:12 PM    <DIR>          IPS2
07/14/2013  12:16 PM    <DIR>          IPS3
07/14/2013  01:50 PM    <DIR>          IPS4
07/14/2013  12:17 PM    <DIR>          IPS5
07/14/2013  12:17 PM    <DIR>          IPS6
07/14/2013  12:18 PM    <DIR>          IPS7
07/14/2013  12:18 PM    <DIR>          IPS8
06/16/2013  01:10 PM    <DIR>          IPSCommon
07/08/2013  12:32 PM    <DIR>          _IPS10
07/08/2013  12:32 PM    <DIR>          _IPS11
07/08/2013  12:32 PM    <DIR>          _IPS12
07/08/2013  12:32 PM    <DIR>          _IPS13
07/08/2013  12:32 PM    <DIR>          _IPS14
07/08/2013  12:57 PM    <DIR>          _IPS15
07/08/2013  12:32 PM    <DIR>          _IPS16
07/08/2013  03:38 PM    <DIR>          _IPS17
07/08/2013  12:32 PM    <DIR>          _IPS18
07/08/2013  12:32 PM    <DIR>          _IPS9
               0 File(s)              0 bytes
              22 Dir(s)  770,968,162,304 bytes free
  • 要求仅使用IPS7之类的数字并且不以_开头的IPS字词

我使用了以下正则表达式IPS\d+\d*$,但这会使以_开头的单词也

我该如何指定!不是_

5 个答案:

答案 0 :(得分:4)

您正在尝试解析Windows dir命令的输出,我假设您尝试列出目录中的文件。您应该知道这不是实现这一目标的好方法,我将向您展示一些替代方案。已经给出了正则表达式的答案,所以我不会理会这一点。

使用glob< ... >,这几乎是对shell如何扩展通配符的仿真。

my @ips = grep /^IPS\d+/,      # only IPS with number
          grep -d,             # only directories
          <D:/Program/IPS*>;   # list IPS file in the target dir

使用opendir

opendir my $dh, "D:/Program" or die $!;
my @ips = grep /^IPS\d+/, readdir($dh);   
closedir $dh;

使用File::Find。请注意,此选项是递归的(还将列出子目录中的文件):

use File::Find;    # core module in Perl 5
my @ips;
find(sub { push @ips, $File::Find::name if /^IPS\d+/ }, "D:/Program");

每种方法都有自己的优点。在您的情况下,最相似的方法是使用glob。

答案 1 :(得分:2)

使用\b regexp运算符匹配单词边界:

\bIPS\d+$

答案 2 :(得分:1)

您可以使用否定的字符类:

[^_]IPS\d+$

请注意,原始正则表达式中的第二个\d是多余的,因为\d+会贪婪。

答案 3 :(得分:0)

regex之前添加此内容,它会查找字边界,但在IPS

之前仍未包含在结果中
(?<=\b)

所以你的最终正则表达式看起来像

(?<=\b)IPS\d+\d*$

答案 4 :(得分:0)

只需要捕获以IP开头。

请使用以下正则表达式。

(^ IPS \ d +)$