В Perl регулярные выражения отсутствуют в некоторых скобках, но не во всех? - PullRequest
1 голос
/ 04 августа 2011
my @info = `net view printserver2`;
foreach my $printer (@info)
{
$printer =~ /.+\s+Print\s+\((.+)\)/;
print "$1\n";

дает мне:

16-83
16-84) HP DesignJet 755CM(C3198A
16-84b
16-85
16-SW
17-80
18-45) HP DesignJet 250C (D/A1
18-51) HP DesignJet 650C(C2859B

Это оригинал:

(16-83) HP Designjet 800 42 by HP                              
(16-84) HP DesignJet 755CM(C3198A)by HP                        
(16-84b) HP LaserJet 5100 Series PCL6                          
(16-85) HP Designjet T1100ps 44in HPGL2                        
(16-SW) HP LaserJet 4100 Series PCL6                           
(17-80) HP Color LaserJet 5500 PCL 6                           
(18-45) HP DesignJet 250C (D/A1) by HP                         
(18-51) HP DesignJet 650C(C2859B) by HP                        

Что не так с моим регулярным выражением?

Это результат, который я хочу:

16-83
16-84
16-84b
16-85
16-SW
17-80
18-45
18-51

1 Ответ

6 голосов
/ 04 августа 2011

Ваше регулярное выражение соответствует до last")" в строке.Вам нужно указать не жадное совпадение:

$printer =~ /.+\s+Print\s+\((.+?)\)/;

Знак вопроса после. + Означает остановку при первой возможности.

Или, что еще лучше, укажите, что нет ")"могут быть сопоставлены:

$printer =~ /.+\s+Print\s+\(([^)]+)\)/;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...