'Регулярное выражение' VS 'Операторы / функции сравнения строк' - PullRequest
6 голосов
/ 20 сентября 2010

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

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

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

возьмите этот пример:

PHP

preg_match('/^[a-z]*$/','thisisallalpha');

C #

new Regex("^[a-z]*$").IsMatch('thisisallalpha');

можно легко сделать с помощью

PHP

ctype_alpha('thisisallalpha');

C #

VFPToolkit.Strings.IsAlpha('thisisallalpha');

Есть много других примеров, но вы должны понять, что я пытаюсь сделать.

К какой версии сравнения строк следует стремиться и почему?

Ответы [ 5 ]

6 голосов
/ 20 сентября 2010

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

php-разработчикам активно промывают мозги по поводу "производительности", когда возникает множество слуховвозникают мифы, в том числе такие глупые вещи, как «двойные кавычки медленнее».Regexps, являющийся "медленным", является одним из этих мифов, к сожалению, поддерживаемым руководством (см. Печально известный комментарий на странице preg_match).Правда в том, что в большинстве случаев вам все равно.Если ваш код не повторяется 10000 раз, вы даже не заметите разницы между строковой функцией и регулярным выражением.И если ваш код повторяется 10000 раз, вы должны делать что-то не так в любом случае, и вы повысите производительность за счет оптимизации логики, а не за счет сокращения регулярных выражений.однако читать код, который их использует , в большинстве случаев короче, чище и проще (сравните ваши и мои ответы по приведенной выше ссылке).

Другая важная проблема - это гибкость, особеннов PHP, чья библиотека строк не поддерживает Unicode из коробки.В вашем конкретном примере, что происходит, когда вы решаете перенести свой сайт на utf8?С ctype_alpha вам как-то не повезло, preg_match потребует другой шаблон, но будет продолжать работать.

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

1 голос
/ 20 сентября 2010

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

Не используйте preg_match (), если вы хотите проверить, содержится ли одна строка в другой. Вместо этого используйте strpos () или strstr (), так как они будут быстрее.

Или со страницы руководства str_replace:

Если вам не нужны необычные правила замены (например, регулярные выражения), вы всегда должны использовать эту функцию вместо ereg_replace () или preg_replace ().

Тем не менее, я обнаружил, что люди пытаются использовать строковые функции для решения проблем, которые лучше решать с помощью регулярных выражений. Например, когда я пытался создать совпадение строк из полных слов, я сталкивался с людьми, пытающимися использовать strpos($string, " $word ") (обратите внимание на пробелы) ради «производительности», не задумываясь о том, что пробелы - не единственные способ разграничить слово (подумайте, сколько вызовов строковых функций потребуется для полной замены preg_match('/\bword\b/', $string)).

Моя личная позиция - использовать строковые функции для сопоставления статических строк (т. Е. Совпадения отдельной последовательности символов, где совпадение всегда одинаковое) и регулярных выражений для всего остального.

1 голос
/ 20 сентября 2010

Регулярные выражения на самом деле приводят к увеличению производительности (а не к тому, что такая микрооптимизация в любом случае имеет смысл), когда они могут заменить несколько сравнений атомных строк. Поэтому обычно около пяти проверок strpos () рекомендуется использовать вместо этого регулярное выражение. Больше для удобочитаемости.

И вот еще одна мысль, чтобы подвести итог: PCRE может обрабатывать условия быстрее, чем ядро ​​Zend, может обрабатывать байт-код IF.

Не все регулярные выражения имеют одинаковый дизайн. Если сложность становится слишком высокой, рекурсивное выражение может убить преимущество в производительности. Поэтому часто бывает целесообразно смешивать сопоставление регулярных выражений и обычные строковые функции PHP. Правильный инструмент для работы и все.

0 голосов
/ 20 сентября 2010

Согласились, что PHP люди склонны переоценивать производительность одной функции над другой.Это не означает, что различий в производительности не существует - они определенно существуют - но большинство PHP-кода (и вообще-то большинства кода) имеют намного худших узких мест, чем выбор регулярного выражения вместо сравнения строк,Чтобы узнать, где находятся ваши узкие места, используйте профилировщик xdebug.Исправьте проблемы, которые возникают, прежде чем беспокоиться о тонкой настройке отдельных строк кода.

0 голосов
/ 20 сентября 2010

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

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

...