我希望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*$
,但这会使以_
开头的单词也
我该如何指定!不是_
?
答案 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 +)$