Не могу заставить регулярное выражение Perl быть не жадным - PullRequest
3 голосов
/ 08 декабря 2011

Мое регулярное выражение соответствует последнему набору буквенных символов в строке независимо от того, что я делаю.Я хочу, чтобы это соответствовало только первому случаю.Я попытался использовать не жадный оператор, но он упрямо соответствует самому правому набору буквенных символов, в данном случае давая $ 1 значение «Trig», а это не то, что мне нужно.Я хочу, чтобы 1 доллар был "02.04.07.06 Geerite".

Любая помощь будет оценена!

КОД:

elsif ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/)
{
    print OUTPUT "NT5 ".$1." | | \n";
}

ИСТОЧНИК:

02.04.07.06 Geerite Cu8S5 R 3m, R 3m или R 32 Trig

ВЫХОД:

NT2 32 Trig ||

Другими словами, я хочу получить в качестве вывода:

NT2 02.04.07.06 Geerite ||

Ответы [ 4 ]

1 голос
/ 08 декабря 2011

Ваше регулярное выражение не может соответствовать "32 Trig", должны быть некоторые другие проблемы.

Если я добавлю пробел в начале строки вашего примера и удалю несвязную ? после последнего квантификатора, он выдаст желаемый результат.

$line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*)/

Значение [[:alpha:]]*? будет соответствовать как можно меньшему, поэтому из-за отсутствия следующего шаблона оно будет соответствовать 0 символам.

1 голос
/ 08 декабря 2011

Это должно работать для вас:

perl -e '$_ = "02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig"; print "$1\n" if /(\d\d\.\d\d\.\d\d\.\d\d \w+)/'

печатает:

02.04.07.06 Geerite

Регламент сам по себе:

/(\d\d\.\d\d\.\d\d\.\d\d \w+)/
1 голос
/ 08 декабря 2011

Сделать [[:alpha:]] жадным:

$line = '   02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig';
if ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*)/) {
    print OUTPUT "NT5 ".$1." | | \n";
}

выход:

NT5 02.04.07.06 Geerite | | 
1 голос
/ 08 декабря 2011

Если я изменю ваш код на

$line="     02.04.07.06 Geerite Cu8S5 R 3m, R 3m, or R 32 Trig ";
if ($line =~ /\s(\d{2}\.\d{2}\.\d{2}\.\d{2}\s[[:alpha:]]*?)/) { print "NT5 ".$1." | | \n"; }

Я получаю этот вывод:

NT5 02.04.07.06  | | 

Делая * не жадным, слово Geerite включено в вывод.

Ваши наблюдаемые результаты, вероятно, получены из другой ветви дерева if-elsif-else.

...