Не хочу траву курить и других наркотиков, а хочу чесать за ушком добродушных котиков! (c)
Всем доброго времени сурок!
В своем коде на php и Javasсript я часто использую регулярные выражения. И тут мне стало интересно как это влияет на скорость выполнения скриптов. В Javasсript я заметила, что время выполнения метода replace(/шаблон/) дольше чем производить замену используя циклы.
Хочется спросить мнение участников и подписчиков сообщества о вреде и пользе регулярных выражениях. В каких языках вы часто их используете, а в каких, наоборот, стараетесь избегать?
И небольшая голосовалка в конце
Вопрос: Как часто вы используете регулярные выражения?
1. Часто. Везде где только можно. | 7 | (26.92%) | |
2. Иногда. | 13 | (50%) | |
3. Редко. Стараюсь их избегать. | 5 | (19.23%) | |
4. Вообще не использую. | 1 | (3.85%) | |
Всего: | 26 |
Использую чаще всего на Perl.
Голосовалка мне не подходит - я использую по необходимости.
В каком-то коде - часто, в каком-то - редко.
К тому же, если не хайлоад, то к чему эта экономия на спичках? Пхп и так тот ещё слон.
ps: проголосовал "иногда" ибо на практике использую для парсинга страниц (которые могут быть не_валидными) и для проверки в полях ввода, а это ~90% всех задач, которые мне попадаются для регэкспов.
Согласна. Как-то переписывала свои ранние РВ. После этого время выполнения тестов подсократилась )
А для простых вещей хорошо бы юзать filter_var и не изобретать свои велосипеды.
На САБЖ ответ будет ни рыба ни мясо – если поиск простой и/или в экспоненту уйти шансов много, то замена, если сложное, то регексп.
Ответный вопрос не холивара ради, а интереса для: с какими задачами сталкиваетесь, для которых используете регекспы? Валидация урлов/логинов/паролей не в счёт (:
А простая замена подстроки в Javasсript быстрее всего делается через split+join (если исходная строка не очень большая, конечно).
Я в основном использую регулярки для анализа рабочих логов:
1) чтобы быстро разложить подстроку по переменным (даты, hex-значения, и т.д. - порядка 7-10 переменных) и с ними работаю потом.
2) для поиска строк со сложными условиями, где простым поиском не обойдёшься
Замену использую довольно редко.
А что вы пытаетесь заматчить этим регэкспом? Он выглядит как минимум странно.
Скептичный циник, с какими задачами сталкиваетесь, для которых используете регекспы? Валидация урлов/логинов/паролей не в счёт (:
В основном для парсинга html-страниц, и для массовой замены в документе.
В последняя время документы становятся все объемнее, вот и стала задумывться о производительности.
Просто пытаюсь понять смысл выражения /(a+)*b/, и почему не
/(((((a+)*)+)*)+)*b//(?>a*)b/, например?он полностью идентичен шаблону /a*b/, но скорость работы этих двух шаблонов кардинально разная.
Я привёл этот пример в качестве демонстрации того, что неудачные шаблоны могут существенно тормозить.
А вообще, у них есть и другие плюсы, например, возможность выносить регулярные выражения в конфигурацию приложения, или компилировать их (в некторых яп), что ещё более их ускоряет, легко менять круг решаемых задач модификациями выражения, вместо переписывания сложного алгоритма, легко переносить выражения между приложениями, написанными на разных языках, чего не скажешь про алгоритмы...
А минусов только два: меньшее быстродействие на простейших задачах (где их можно и не использовать) и сложность составления/анализа заковыристых выражений.
Ну, значит не полностью =)
>Я привёл этот пример в качестве демонстрации того, что неудачные шаблоны могут существенно тормозить.
А я вёл к тому, что применяя любой инструмент необходимо понимать, как этот инструмент работает, как им пользоваться, и что ты хочешь получить в результате. Это касается не только регулярок, но в регулярках я чаще всего видел очень неоптимально написанные выражения. На втором месте - применение jQuery =)
Иными словами, неудачные программисты могут сильно тормозить свои программы =)
Кстати, вспомнилось: habrahabr.ru/post/168591/
P.s. К вопросу о понимании работы: php'шка не выдаёт значительного расхождения между временем выполнения этих двух выражений на строке "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab". За то на "aaaaaaaсaaaaab" отрабатывает в шесть раз медленнее, а если в начале поставить ещё одну "a" - то в десять. И если знать, как обрабатываются регулярки в php, это вовсе не удивляет.
habrahabr.ru/post/131915/
А вот об этом я как-то и не подумала... Спасибо! Тут действитльно РП дают существенное преимущество.
O, Кстати, вспомнилось: habrahabr.ru/post/168591/
Черт, это круто!
Trotill, www.regular-expressions.info/catastrophic.html
Низкий поклон тебе за эту ссылку. Действительно, так можно и ненароком сервак подвесить.