<div dir="ltr"><div><div>Пример того, сколько раз с какой позиции ведется поиск, возвраты генерируются последним квантификатором \s*:<br></div><div>#-----</div><div><div>    $str = "1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1"; </div><div>    $r = '3\s*?(?:[^a-z]\s*?)+?r';</div><div><br></div><div>    for $i ( 1 .. 16 ){</div><div>        ( $ii1, $ii2, $ii3, $ii4, $ii5 ) = 0;</div><div>        $prefix = ($r x $i).'';</div><div>        </div><div>        #|      /$prefix|2\s*?(?:[^a-z]\s*?)+?r/;</div><div>        $str =~ /$prefix|2(?{ $ii1++ })\s*?(?{ $ii2++ })(?:[^a-z](?{ $ii3++ })\s*?(?{ $ii4++ }))+?(?{ $ii5++ })r/;</div><div><br></div><div>        print "$i| $ii1:$ii2:$ii3:$ii4:$ii5\n"</div><div>    }</div></div></div><div>#-----<br></div><div><br></div><div>результат:</div><div><br></div><div><div>1| 1:2:148:213:163</div><div>2| 1:2:188:265:219</div><div>3| 1:2:230:321:275</div><div>4| 1:2:272:377:331</div><div>5| 1:2:315:435:387</div><div>6| 1:2:356:489:443</div><div>7| 1:2:398:545:499</div><div>8| 1:2:440:601:555</div><div>9| 1:2:484:661:611</div><div>10| 1:2:524:713:667</div><div>11| 1:2:566:769:723</div><div>12| 1:2:608:825:779</div><div>13| 1:2:650:881:835</div><div>14| 1:2:692:937:891</div><div>15| 1:2:201326589:268435451:268435451</div><div>16| 1:2:201326589:268435451:268435451</div></div><div><br></div><div>экспонента именно по числу возвратов/попыток</div></div><div class="gmail_extra"><br><div class="gmail_quote">29 октября 2016 г., 13:28 пользователь Динар Жамалиев <span dir="ltr"><<a href="mailto:zhdinar@gmail.com" target="_blank">zhdinar@gmail.com</a>></span> написал:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra" style="font-size:12.8px">вернее такие шаблоны выдают идентичный результат</div><div class="gmail_extra" style="font-size:12.8px"> /bla\s*?bla/ и</div><div class="gmail_extra" style="font-size:12.8px"><div class="gmail_extra"> /bla\s+?bla/</div></div></div><div class="gmail_extra"><br><div class="gmail_quote">29 октября 2016 г., 13:13 пользователь Динар Жамалиев <span dir="ltr"><<a href="mailto:zhdinar@gmail.com" target="_blank">zhdinar@gmail.com</a>></span> написал:<div><div class="h5"><br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra">Ясно изъясняться не моя фишка. Под сутью я имел другое. Для примера в контексте строки вида </div><div class="gmail_extra"> "bla bla bla"  </div><div class="gmail_extra">шаблоны вида </div><div class="gmail_extra"> /bla\s*?/ и</div><div class="gmail_extra"><div class="gmail_extra"> /bla\s+?/ и</div><div>идентичны в том смысле, что подстрока "bla " все равно будет найдена, не так ли?</div><div><br></div></div><div class="gmail_extra"><div class="gmail_quote">29 октября 2016 г., 2:41 пользователь Loginoff Nick via Moscow-pm <span dir="ltr"><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<div><div class="m_-8382994599473616660h5"><br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>\s* != \s+ - так что это очень сильно меняет суть шаблона. В данном контексте пробела может и не быть... Так что это не решает проблему</div><div> </div><div>28.10.2016, 21:44, "Динар Жамалиев via Moscow-pm" <<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>>:</div><blockquote type="cite"><div><div class="m_-8382994599473616660m_-4318512488725742523gmail-h5"><div>Если везде заменить \s* на \s+, что не меняет сути шаблона, результат будет мгновенным, так как квантификатор +? не отступает назад, захват либо есть максимально возможный, либо нет. В то время как *? сначала захватывает все, затем отступает Каждый дополнительный * значительно увеличивает число комбинаций. В твоем случае 16й элемент приводит к экспоненциальному увеличению возможных комбинаций</div><div> <div>28 октября 2016 г., 22:30 пользователь Artem Zhuravlev via Moscow-pm <span><<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a>></span> написал:<blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div>Тут скорее дело в Захвате и построение обратных ссылок для них, на 16+ явно замедляется <br><br><br>Вот переменная без захватом отработает быстро<div style="font-size:12.8px">my $regexp16 = qr('</div><div style="font-size:12.8px">(?:3\s*?(?:[^a-z]\s*?)+?r)</div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">3\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">|(<span style="font-size:12.8px">?:</span><span style="font-size:12.8px">2\s*?(?:[^a-z]\s*?)+?r)</span></div><div style="font-size:12.8px">');<br><br><br>Так что думаю стоит уменьшить количество захватов.<br><br>Ну или как в книге пишут если можно то <br><br>вместо /a|b/ <br><br>пишите /a/ || /b/</div><div> </div></div><br>--<br>Moscow.pm mailing list<br><a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" target="_blank">http://moscow.pm.org</a><br> </blockquote></div></div></div></div>,<span>--<span class="m_-8382994599473616660m_-4318512488725742523gmail-"><br>Moscow.pm mailing list<br><a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org/" target="_blank">http://moscow.pm.org</a></span></span></blockquote><div> </div><div> </div><div class="m_-8382994599473616660m_-4318512488725742523gmail-HOEnZb"><div class="m_-8382994599473616660m_-4318512488725742523gmail-h5"><div>-- <br>С Уважением, Login|off Nick или STork.</div><div> </div></div></div><br>--<br>
Moscow.pm mailing list<br>
<a href="mailto:moscow-pm@pm.org" target="_blank">moscow-pm@pm.org</a> | <a href="http://moscow.pm.org" rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
<br></blockquote></div></div></div><br></div></div>
</blockquote></div></div></div><br></div>
</blockquote></div><br></div>