2014-01-17 3 views
0

У меня есть шаблон, Пусть будет это,Как grep для определенного шаблона ровно два раза в perl?

pppoe lg id 827 vlan-id 100 pppoe [email protected] local Jan 3 14:41:20

из этого я хотел бы вычленить информацию шаблона «» и PPPoE необходимо убедиться, что он присутствует ровно два раза.

pppoe lg id 827 vlan-id 100 pppo [email protected] local Jan 3 14:41:20

здесь pppoe присутствует только один раз, другой pppo, на этот раз оно не должно совпадать.

ответ

0

Вы можете использовать:

^((?!pppoe).)*(pppoe)((?!pppoe).)*\2((?!pppoe).)*$ 

См Demo

Объяснение:

Explanation

+0

-1: И как это не соответствует на три или более 'ppoe' в строка? * «убедитесь, что он присутствует ровно два раза» * – grebneke

+0

На самом деле я пробовал этот код, и он сработал. /^ (pppoe) {2} $/ –

+2

@ user3205318 Сомневаюсь? '/^(pppoe) {2} $ /' соответствует точной строке 'pppoepppoe' и ничего больше. – grebneke

4

прямо вперед способ поставить спички в массив и проверка количество предметов:

my $str = "pppoe lg id 827 vlan-id 100 pppoe user\@local local Jan 3 14:41:20"; 
my @count = $str =~ /pppoe/g; 
if (scalar @count == 2) { 
    print "MATCH exactly two times\n"; 
} 

или, как это было предложено mpapec:

print "MATCH\n" if scalar @{[ $str =~ /pppoe/g ]} == 2; 
+0

Вы имели в виду '/ \ bpppoe \ b/g'? – Kenosis

+2

@ Кенозис нет, не правда? ОП не говорит, что это должно быть отдельное слово, только «шаблон». – grebneke

+0

Существует также [Goatse Operator] (http://www.catonmat.net/blog/secret-perl-operators/#goatse), но для меня это неясно и страшно ... – grebneke

0

Все, что необходимо, это

if ($str =~ /pppoe.*pppoe/) { 
    ... 
} 
Смежные вопросы