сравнения регулярных выражений потребляют много ресурсов? - PullRequest
2 голосов
/ 22 октября 2008

Не знаю, но сильно ли замедлится ваша машина, если вы используете очень сложное регулярное выражение? например, известный модуль проверки электронной почты, предложенный совсем недавно? которые можно найти здесь RFC822

обновление: извините, я все равно должен был задать этот вопрос в спешке. Я разместил ссылку на регулярное выражение электронной почты, о котором говорил

Ответы [ 9 ]

3 голосов
/ 22 октября 2008

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

Я здесь не эксперт. Я получил все это от чтения Мастеринг регулярных выражений Джеффри Э. Ф. Фридлом. Возможно, вы захотите посмотреть это.

3 голосов
/ 22 октября 2008

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

Обучающие программы по http://www.regular -expressions.info / предлагают рекомендации по производительности, так что это может быть хорошим началом.

2 голосов
/ 22 октября 2008

Вас могут заинтересовать такие статьи, как: Сопоставление регулярных выражений может быть простым и быстрым или Понимание регулярных выражений .

Это, увы, легко написать неэффективные RE, которые могут сравнительно быстро совпадать при успехе, но могут искать часы, если совпадений не найдено, потому что движок тупо пробует длинное совпадение на каждой позиции длинной строки! *

Есть несколько рецептов для этого, например, якорение, когда это возможно, избегание жадности, если это возможно, и т. Д.

Обратите внимание, что гигантское выражение электронной почты не является новым и не обязательно медленным: короткое, простое выражение может быть медленнее, чем более запутанное!

Обратите также внимание, что в некоторых ситуациях (например, в случае электронной почты) может быть более эффективным (и поддерживаемым!) Использование комбинации регулярных выражений и кода для обработки случаев, таких как разбиение в @, обработка различных случаев (сначала часть начинается с "или нет, вторая часть - это IP-адрес или домен и т. д.).

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

2 голосов
/ 22 октября 2008

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

Использование класса отрицательных символов, например, экономит затраты на возврат символов в движке (т.е. / <[^>] +> / вместо /<.+?>/)(*). , но экономит много циклов, когда вам нужно сопоставить большую часть текста.

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

1 голос
/ 23 октября 2008

Вы не можете говорить о регулярных выражениях вообще больше, чем вы можете говорить о коде в целом.

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

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

1 голос
/ 22 октября 2008

Это зависит от вашего движка регулярных выражений. Как объяснено здесь (сопоставление регулярных выражений может быть простым и быстрым) может существовать некоторое важное различие в производительности в зависимости от реализации.

0 голосов
/ 22 октября 2008

Зависит от сложности выражения и языка, с которым оно используется.

в JavaScript; Вы должны оптимизировать все. В C #; не так много.

0 голосов
/ 22 октября 2008

Однажды я написал жадный - случайно, конечно :-) - многострочное регулярное выражение и заставил его искать / заменять 10 * 200 ГБ текстовых файлов. Это было чертовски медленно ... Так что это зависит от того, что ты пишешь и что проверяешь.

0 голосов
/ 22 октября 2008

Однажды я создал программу, которая анализировала много текста (большая база кода,> 300 тыс. Строк). Сначала я использовал regex, но когда я переключился на обычные строковые функции, он стал намного быстрее, например, занимал 40% времени версии regex. Так что, конечно, это зависит, моя вещь стала намного быстрее.

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