Вопрос про reg exps в perl - PullRequest
       0

Вопрос про reg exps в perl

3 голосов
/ 27 июня 2011

Мне нужно написать регулярное выражение, которое будет анализировать строки следующим образом:

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

Я хочу извлечь имена пакетов (без номеров версий и скобок).

Я написал что-то вроде этого:

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

Но это не совсем то, что я хочу.

Кто-нибудь знает, как с этим справиться?

P.S. Я просто хочу получить список: "cdbs debhelper smthelse" в результате

Ответы [ 4 ]

0 голосов
/ 27 июня 2011

Как насчет разделения ввода на пробел и печати каждого элемента, если ( отсутствует?Нечто подобное возможно

perl -lane 'foreach $_ (@F[1..scalar(@F)]) {print if not m/\(/}'
cdbs,
debhelper
smthelse
0 голосов
/ 27 июня 2011

С вашим регулярным выражением /^Build-Depends:\s*(\S+)\s$/ вы соответствуете до конца строки.Попробуйте /^Build-Depends:\s*(\S+)\s/ вместо этого.

0 голосов
/ 27 июня 2011

Это будет работать для типов имен пакетов, перечисленных здесь.

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 голосов
/ 27 июня 2011

Это регулярное выражение должно делать то, что вы хотите: /\s(\S*)(?:\s\(.*?\))?(?:,|$)/g

Редактировать : Вы бы назвали его так, чтобы просмотреть все результаты:

while ($str =~ /\s(\S*)(?:\s\(.*?\))?(?:,|$)/g) {
    print "$1 is one of the packages.\n";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...