Есть ли простой способ сопоставить более 1 вхождения указанной строки в каждой строке? - PullRequest
1 голос
/ 29 июля 2009

Я пытался сделать следующее:

 if (m/(foobar)\{2,}?/ig)

, чтобы обработать файл и действовать только на те строки, где присутствует более 2 вхождений 'foobar'. Не работает - я подозреваю, что может понадобиться метод "обратных ссылок", но я буду приятно удивлен, если кто-то здесь сможет сделать это с помощью простой техники сопоставления

Ответы [ 2 ]

7 голосов
/ 29 июля 2009

все довольно просто:

if ( $str =~ /foobar.*foobar/ ) {

Конечно, ваш foobar может быть немного сложным, так что давайте использовать обратную ссылку:

if ( $str =~ /(foobar).*\1/ ) {

А что, если вы хотите, чтобы оно совпадало, только если это 5 раз подряд? Простой:

if ( $str =~ /(foobar)(.*\1){4}/ ) {

или лучше:

if ( $str =~ /(foobar)(?:.*\1){4}/ ) {

Подробнее о?: И других подобных магических строках вы можете прочитать perldoc perlre .

7 голосов
/ 29 июля 2009

Вы не можете использовать квантификаторы {}, потому что это только для повторов. (например, "foobar foobar foobar"). Если бы в вашей строке было «fooobar more foobar», это не соответствовало бы. Самый простой и понятный способ - сделать это, сложив спички в массив, подобный следующему:

 my @matches = $str =~ /(foobar)/ig;

Тогда @matches будет содержать все совпадения.

if (@matches >=2) {
   # work in special sauce
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...