[Moscow.pm] Регулярные выражения. Помогите понять, почему так.
Андрей Асякин
asan999 на gmail.com
Пт Окт 28 11:53:11 PDT 2016
+?, *? работают одинаково, ? отключает жадность (отступать назад им
бессмысленно), а вот ++, *+ - да, не откатываются назад при неудаче.
On 10/28/2016 09:44 PM, Динар Жамалиев via Moscow-pm wrote:
> Если везде заменить \s* на \s+, что не меняет сути шаблона, результат
> будет мгновенным, так как квантификатор +? не отступает назад, захват
> либо есть максимально возможный, либо нет. В то время как *? сначала
> захватывает все, затем отступает Каждый дополнительный * значительно
> увеличивает число комбинаций. В твоем случае 16й элемент приводит к
> экспоненциальному увеличению возможных комбинаций
>
> 28 октября 2016 г., 22:30 пользователь Artem Zhuravlev via Moscow-pm
> <moscow-pm на pm.org <mailto:moscow-pm на pm.org>> написал:
>
> Тут скорее дело в Захвате и построение обратных ссылок для них, на
> 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
> moscow-pm на pm.org <mailto:moscow-pm на pm.org> | http://moscow.pm.org
>
>
>
>
----------- следущая часть -----------
Вложение в формате HTML было извлечено…
URL: <http://mail.pm.org/pipermail/moscow-pm/attachments/20161028/c58c3aa7/attachment.html>
Подробная информация о списке рассылки Moscow-pm