2010-08-01 2 views
1

У меня есть несколько регулярных выражений в Perl-скрипте, которые являются правильными, но медленными. Я рассматриваю возможность повышения производительности, добавляя дополнительные + операторы (т. Е. * + Вместо * и ++ вместо +), чтобы отключить обратную трассировку. Я попытался заменить все их, и регулярные выражения перестали работать ... так много для простого решения. Как узнать, где я могу добавить их, где он не сломает регулярное выражение?улучшение производительности регулярного выражения в Perl, добавив +

+2

Можете ли вы опубликовать некоторые из требуемых регулярных выражений? Оптимизация на примере может помочь вам лучше понять, в каких случаях следует использовать определенные оптимизации. – strager

ответ

6

Если регулярные выражения перестали работать, вы либо Арен» t с использованием версии perl, которая их поддерживает, или вам действительно нужно отступить в этих случаях.

Определите разделы регулярного выражения, которые никогда не нуждаются в обратном отслеживании (то есть, если их просят согласовать, начиная с заданной точки, никогда не будет больше одной длины, которую вы, возможно, захотите, чтобы они соответствовали) и окружить их с (?> ). Это имеет тот же эффект, что и ++/* +, и поддерживается даже до 5.10.

Обратите внимание, что ограничение обратного отслеживания часто не является «оптимизацией», поскольку оно изменяет то, что будет и не будет соответствовать. Идея заключается в том, что вы используете ее для лучшего описания того, что вы на самом деле хотите согласовать. Заимствуя из статьи, связанной с ответом OP, что-то вроде ^(.*?,){11}P (двенадцатое разделенное запятыми поле начинается с P) не просто неэффективно, оно неверно, так как обратное слежение приведет к тому, что он будет фактически соответствовать даже тогда, когда только поле после двенадцатого начинается с P. Исправив его до ^(?>.*?,){11}P, вы ограничиваете его фактическим соответствием правильному числу ведущих полей. (В этом тривиальном случае ^([^,]*,){11}P также выполняет эту работу, но если вы добавите поддержку скрытых или котируемых запятых в поля с чередованием, становится проще выбрать (?>.)

Смежные вопросы