+?, *? работают одинаково, ? отключает жадность (отступать назад им бессмысленно), а вот ++, *+ - да, не откатываются назад при неудаче.

On 10/28/2016 09:44 PM, Динар Жамалиев via Moscow-pm wrote:
Если везде заменить \s* на \s+, что не меняет сути шаблона, результат будет мгновенным, так как квантификатор +? не отступает назад, захват либо есть максимально возможный, либо нет. В то время как *? сначала захватывает все, затем отступает Каждый дополнительный * значительно увеличивает число комбинаций. В твоем случае 16й элемент приводит к экспоненциальному увеличению возможных комбинаций

28 октября 2016 г., 22:30 пользователь Artem Zhuravlev via Moscow-pm <[email protected] <mailto:[email protected]>> написал:

    Тут скорее дело в Захвате и построение обратных ссылок для них, на
    16+ явно замедляется


    Вот переменная без захватом отработает быстро
    my $regexp16 = qr('
    (?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:3\s*?(?:[^a-z]\s*?)+?r)
    |(?:2\s*?(?:[^a-z]\s*?)+?r)
    ');


    Так что думаю стоит уменьшить количество захватов.

    Ну или как в книге пишут если можно то

    вместо /a|b/

    пишите /a/ || /b/

    --
    Moscow.pm mailing list
    [email protected] <mailto:[email protected]> | http://moscow.pm.org





-- 
Moscow.pm mailing list
[email protected] | http://moscow.pm.org

Ответить