Нам часто говорят, что регулярные выражения медленны, и их следует избегать всякий раз, когда это возможно.
Однако, принимая во внимание накладные расходы на выполнение некоторых манипуляций со строками ( не говоря об ошибках алгоритма - этодругое дело ), особенно в PHP
или Perl
(может быть Java
), что такое предел , и в этом случае мы можем считать манипулирование строками лучшей альтернативой?Какие регулярные выражения особенно жадные для процессора?
Например, для следующих операций в C++
, Java
, PHP
или Perl
, что бы вы порекомендовали
Регулярные выражения будутвероятно, будет быстрее:
s/abc/def/g
или решение на основе ... while((i=index("abc",$x)>=0) ...$y .= substr()...
? s/(\d)+/N/g
или алгоритм сканирования
Но как насчет
- регулярное выражение проверки электронной почты?
s/((0|\w)+?[xy]*[^xy]){2,7}/u/g
не будет ли ручной и конкретный алгоритм быстрее (и дольше писать)?
edit
Суть вопроса в том, чтобы определить, какой тип регулярного выражения будет лучше переписан специально для данной проблемы с помощью манипуляции со строками?
edit2
Распространенной реализацией является Perl regexp.Например, в Perl - что требует знать, как они реализованы - какого вида регулярного выражения следует избегать, потому что реализация сделает процесс длительным и неэффективным?Это может быть не сложное регулярное выражение ...
редактировать июль 2011 (на основе комментариев)
Я не говорю, что все регулярные выражения медленные.Известно, что некоторые конкретные шаблоны регулярных выражений являются медленными из-за конкретной обработки их и из-за их реализации.Например, в недавних реализациях Perl / PHP, что, как известно, является довольно медленным - и его следует избегать?Ответ ожидается от людей, которые уже провели свои собственные исследования (профилировщик ...) и которые могут дать своего рода общие рекомендации о том, что рекомендуется / чего следует избегать.