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