улучшение производительности регулярных выражений Perl путем добавления + - PullRequest
1 голос
/ 02 августа 2010

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

Ответы [ 2 ]

6 голосов
/ 02 августа 2010

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

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

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

0 голосов
/ 02 августа 2010

Хммм ... как только я отправил вопрос, просмотр колонки «Связанные» привел меня к этому, у которого есть несколько довольно хороших идей .... http://www.regular -expressions.info / catastrophic.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...