<html>
  <head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  </head>
  <body bgcolor="#FFFFFF" text="#000000">
    +?, *? работают одинаково, ? отключает жадность (отступать назад им
    бессмысленно), а вот  ++, *+ - да, не откатываются назад при
    неудаче.<br>
    <br>
    <div class="moz-cite-prefix">On 10/28/2016 09:44 PM, Динар Жамалиев
      via Moscow-pm wrote:<br>
    </div>
    <blockquote
cite="mid:CAAKGKyCUHakqDVu7Vw=S_P4hLoi2w2Di+5Bd-XHt8bGg17X80g@mail.gmail.com"
      type="cite">
      <div dir="ltr">Если везде заменить \s* на \s+, что не меняет сути
        шаблона, результат будет мгновенным, так как квантификатор +? не
        отступает назад, захват либо есть максимально возможный, либо
        нет. В то время как *? сначала захватывает все, затем отступает
        Каждый дополнительный * значительно увеличивает число
        комбинаций. В твоем случае 16й элемент приводит к
        экспоненциальному увеличению возможных комбинаций</div>
      <div class="gmail_extra"><br>
        <div class="gmail_quote">28 октября 2016 г., 22:30 пользователь
          Artem Zhuravlev via Moscow-pm <span dir="ltr"><<a
              moz-do-not-send="true" href="mailto:moscow-pm@pm.org"
              target="_blank">moscow-pm@pm.org</a>></span> написал:<br>
          <blockquote class="gmail_quote" style="margin:0 0 0
            .8ex;border-left:1px #ccc solid;padding-left:1ex">
            <div dir="ltr">Тут скорее дело в Захвате и построение
              обратных ссылок для них, на 16+ явно замедляется <br>
              <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 class="gmail_extra">
              </div>
            </div>
            <br>
            --<br>
            Moscow.pm mailing list<br>
            <a moz-do-not-send="true" href="mailto:moscow-pm@pm.org">moscow-pm@pm.org</a>
            | <a moz-do-not-send="true" href="http://moscow.pm.org"
              rel="noreferrer" target="_blank">http://moscow.pm.org</a><br>
            <br>
          </blockquote>
        </div>
        <br>
      </div>
      <br>
      <fieldset class="mimeAttachmentHeader"></fieldset>
      <br>
    </blockquote>
    <br>
  </body>
</html>