Не хочу траву курить и других наркотиков, а хочу чесать за ушком добродушных котиков! (c)

Всем доброго времени сурок!

В своем коде на php и Javasсript я часто использую регулярные выражения. И тут мне стало интересно как это влияет на скорость выполнения скриптов. В Javasсript я заметила, что время выполнения метода replace(/шаблон/) дольше чем производить замену используя циклы.

Хочется спросить мнение участников и подписчиков сообщества о вреде и пользе регулярных выражениях. В каких языках вы часто их используете, а в каких, наоборот, стараетесь избегать?

И небольшая голосовалка в конце ;)



Вопрос: Как часто вы используете регулярные выражения?
1. Часто. Везде где только можно. 
7  (26.92%)
2. Иногда. 
13  (50%)
3. Редко. Стараюсь их избегать. 
5  (19.23%)
4. Вообще не использую. 
1  (3.85%)
Всего:   26

@темы: Вопрос, Точка зрения

Комментарии
29.03.2013 в 10:49

Простая замена и простой поиск быстрее РВ. РВ тоже можно оптимизировать. Есть РВ, которые отлавливают одно и тоже, но скорость работы у них разная.

Использую чаще всего на Perl.
Голосовалка мне не подходит - я использую по необходимости.
В каком-то коде - часто, в каком-то - редко.
29.03.2013 в 10:58

Миру - мир. А Вам - пломбир!
Регулярки медленнее, но удобнее. Иногда потеря в скорости стоит их удобства и читабельности, имхо.
К тому же, если не хайлоад, то к чему эта экономия на спичках? Пхп и так тот ещё слон.

ps: проголосовал "иногда" ибо на практике использую для парсинга страниц (которые могут быть не_валидными) и для проверки в полях ввода, а это ~90% всех задач, которые мне попадаются для регэкспов.
29.03.2013 в 10:59

Попробуйте для поиска применить (a+)*b для выражения aaaaaaab :)
29.03.2013 в 11:00

Не хочу траву курить и других наркотиков, а хочу чесать за ушком добродушных котиков! (c)
Trotil, РВ тоже можно оптимизировать.
Согласна. Как-то переписывала свои ранние РВ. После этого время выполнения тестов подсократилась )
29.03.2013 в 11:50

Я знаю, что я гений, но мне от этого ничуть не легче.
Reyko32, регулярки не предназначены для операций типа "заменить dog на cat". А вот проверить, является ли введенная строка синтаксически корректным адресом (почта или веб, например), или выдернуть из текста все адреса email или номера телефонов - вот тут регулярки будут и удобнее и быстрее. Я уж молчу про более специфичные применения, типа, к примеру, в куске html все значения атрибутов завернуть в кавычки. :)
29.03.2013 в 11:50

Миру - мир. А Вам - пломбир!
Trotil, не надо забивать микроскопом гвозди – вы же не среди белого шума информацию ищете? (: В вебе на рандомной странице шансы наткнуться на что-то неудобоваримое при поиске валидного url крайне малы.
А для простых вещей хорошо бы юзать filter_var и не изобретать свои велосипеды.

На САБЖ ответ будет ни рыба ни мясо – если поиск простой и/или в экспоненту уйти шансов много, то замена, если сложное, то регексп.

Ответный вопрос не холивара ради, а интереса для: с какими задачами сталкиваетесь, для которых используете регекспы? Валидация урлов/логинов/паролей не в счёт (:
29.03.2013 в 12:24

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

А простая замена подстроки в Javasсript быстрее всего делается через split+join (если исходная строка не очень большая, конечно).
29.03.2013 в 12:52

Аккаунт для использования в публичных местах. Основной ник - Trotil.
с какими задачами сталкиваетесь, для которых используете регекспы? Валидация урлов/логинов/паролей не в счёт (:

Я в основном использую регулярки для анализа рабочих логов:
1) чтобы быстро разложить подстроку по переменным (даты, hex-значения, и т.д. - порядка 7-10 переменных) и с ними работаю потом.
2) для поиска строк со сложными условиями, где простым поиском не обойдёшься

Замену использую довольно редко.
29.03.2013 в 14:08

Пау-чок
>Попробуйте для поиска применить (a+)*b
А что вы пытаетесь заматчить этим регэкспом? Он выглядит как минимум странно.
29.03.2013 в 14:10

Аккаунт для использования в публичных местах. Основной ник - Trotil.
последовательность аааaaaaab, там указано.
29.03.2013 в 14:10

Не хочу траву курить и других наркотиков, а хочу чесать за ушком добродушных котиков! (c)
mikluho, А вот проверить, является ли введенная строка синтаксически корректным адресом (почта или веб, например), или выдернуть из текста все адреса email или номера телефонов - вот тут регулярки будут и удобнее и быстрее. Быстроту не проверяла ))) Но согласна, это гораздо удобнее, поэтому использую регулярки довольно часто.

Скептичный циник, с какими задачами сталкиваетесь, для которых используете регекспы? Валидация урлов/логинов/паролей не в счёт (:
В основном для парсинга html-страниц, и для массовой замены в документе.

В последняя время документы становятся все объемнее, вот и стала задумывться о производительности.
29.03.2013 в 14:27

Пау-чок
Trotill, я спрашивал о том, на каких строках этот регэксп должен срабатывать? Потому как чтобы заматчить строку "аааaaaaab" дотаточно регэкспа /а{7}b/. А то и без него можно обойтись - простой проверкой на вхождение подстроки.
Просто пытаюсь понять смысл выражения /(a+)*b/, и почему не /(((((a+)*)+)*)+)*b/ /(?>a*)b/, например?
29.03.2013 в 14:35

Аккаунт для использования в публичных местах. Основной ник - Trotil.
O,
он полностью идентичен шаблону /a*b/, но скорость работы этих двух шаблонов кардинально разная.
Я привёл этот пример в качестве демонстрации того, что неудачные шаблоны могут существенно тормозить.
29.03.2013 в 15:18

Я знаю, что я гений, но мне от этого ничуть не легче.
Reyko32, Быстроту не проверяла ))) - думаю, для подобных целей написать код, работающий быстрее регулярного выражения, будет, мягко говоря, не просто :)
А вообще, у них есть и другие плюсы, например, возможность выносить регулярные выражения в конфигурацию приложения, или компилировать их (в некторых яп), что ещё более их ускоряет, легко менять круг решаемых задач модификациями выражения, вместо переписывания сложного алгоритма, легко переносить выражения между приложениями, написанными на разных языках, чего не скажешь про алгоритмы...
А минусов только два: меньшее быстродействие на простейших задачах (где их можно и не использовать) и сложность составления/анализа заковыристых выражений.
29.03.2013 в 15:28

Пау-чок
Trotill,> но скорость работы этих двух шаблонов кардинально разная.
Ну, значит не полностью =)

>Я привёл этот пример в качестве демонстрации того, что неудачные шаблоны могут существенно тормозить.
А я вёл к тому, что применяя любой инструмент необходимо понимать, как этот инструмент работает, как им пользоваться, и что ты хочешь получить в результате. Это касается не только регулярок, но в регулярках я чаще всего видел очень неоптимально написанные выражения. На втором месте - применение jQuery =)
Иными словами, неудачные программисты могут сильно тормозить свои программы =)

Кстати, вспомнилось: habrahabr.ru/post/168591/

P.s. К вопросу о понимании работы: php'шка не выдаёт значительного расхождения между временем выполнения этих двух выражений на строке "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab". За то на "aaaaaaaсaaaaab" отрабатывает в шесть раз медленнее, а если в начале поставить ещё одну "a" - то в десять. И если знать, как обрабатываются регулярки в php, это вовсе не удивляет.

29.03.2013 в 15:45

Аккаунт для использования в публичных местах. Основной ник - Trotil.
29.03.2013 в 17:19

Не хочу траву курить и других наркотиков, а хочу чесать за ушком добродушных котиков! (c)
mikluho, легко переносить выражения между приложениями
А вот об этом я как-то и не подумала... Спасибо! Тут действитльно РП дают существенное преимущество.

O, Кстати, вспомнилось: habrahabr.ru/post/168591/
Черт, это круто! :-D Теперь есть чем заняться в свободное время.

Trotill, www.regular-expressions.info/catastrophic.html
Низкий поклон тебе за эту ссылку. Действительно, так можно и ненароком сервак подвесить.