2011-06-27 80 views
3

EXPS我需要写正则表达式,将解析字符串是这样的:关于产品REG在Perl

Build-Depends: cdbs, debhelper (>=5), smthelse 

我想提取包名(不包括版本号和括号内)。

我写了这样的事情:

$line =~ /^Build-Depends:\s*(\S+)\s$/ 

但它不正是我想要的。

有人知道如何管理它吗?

P.S.我只是想获得名单:“CDBS debhelper的smthelse”结果

+0

它捕获什么?它与你想要的有什么不同?你的字符串在输入字符串的末尾是否总是有空格? – codaddict

+0

我只想得到清单:“cdbs debhelper smthelse” – Nikita

回答

0

此正则表达式应该做你想要什么:/\s(\S*)(?:\s\(.*?\))?(?:,|$)/g

编辑:你会从所有的结果称呼它循环:

while ($str =~ /\s(\S*)(?:\s\(.*?\))?(?:,|$)/g) { 
    print "$1 is one of the packages.\n"; 
} 
+0

不幸的是(这只是提取第一个,而我需要所有的名字。顺便说一下,我怎么能得到解压缩包的数量? – Nikita

+0

我已经添加了'g '在正则表达式的末尾,这应该使它成为'全局的'并且使它找到所有的匹配(取决于你如何调用这个正则表达式,它可能不是必需的,所以我没有先把它放进去) – EdoDodo

+0

Npw它也不起作用 if($ line =〜/\s(\S*)(?:\s\(.*?\))?((:,,$$)/g){ print“$ 2 \ n”; }在串联(。)或字符串test.pl第8行使用未初始化的值。 – Nikita

0

随着你的正则表达式/^Build-Depends:\s*(\S+)\s$/你是匹配,直到字符串的结尾。代替 尝试/^Build-Depends:\s*(\S+)\s/

+0

然后我只是在末尾用','符号提取名字。 – Nikita

+0

例如,由于未初始化,我不能使用$ 2变量 – Nikita

0

这将适用于此处列出的软件包名称的类型。

use warnings; 
use strict; 

my @packs; 
my $line = "Build-Depends: cdbs, debhelper (>=5), smthelse"; 

if ($line =~ /^Build-Depends: (.+)$/) { # get everything 
    @packs = split /,+\s*/, $1; 
    s/\([^)]+\)//g for @packs; # remove version stuff 
} 

print "$_\n" for @packs; 
0

如果(不存在,如何将输入分割为空格并打印每个元素? 也许这样的东西

perl -lane 'foreach $_ (@F[1..scalar(@F)]) {print if not m/\(/}' 
cdbs, 
debhelper 
smthelse