Перестаньте избегать регулярные выражения

от автора

Если вы разрабатываете в Perl, PHP, Python, Ruby, JavaScript (или любом другом языке с поддержкой регулярных выражения) и не знаете регулярные выражения, вы упускаете очень многое. И если вы намеренно избегаете регулярные выражения, это как вырванные страницы из вашего руководства, хотя остальные части его на месте.

Регулярные выражения являются мощным инструментом.

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

  • Нецелевое использование регулярных выражений
  • Непонимание и страх регулярных выражений



Пожалуй, наиболее распространенным примером нецелевого использования регулярного выражения является проверка адреса электронной почты. Например, скажем, вы хотите проверить адрес электронной почты, просто проверив символ @. Использование регулярных выражений preg_match (‘/ @ /’, $ E-mail) является избыточным. Там нет регулярных выражений. Мы просто искали символ. В данном случае уместнее было бы использовать strpos( $email, ‘@’ )

Я говорю: «уместнее», а не «более высокая производительность», потому что в этом примере, где мы работаем с крошечной строкой электронной почты. Потери незначительны. Однако, если мы ищем очень большой строку вместо адреса электронной почты и делаем это несколько раз в течение цикла, это приведет к значительному улучшению производительности. Например, необходимо найти несколько строк в исходниках html страницы.

Если ведется поиск какой-то постоянной строки — не используйте регулярные выражения!

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

Давайте добавим несколько небольших требованиях к нашему примеру. Скажем, мы хотим убедиться, что символ @ является первым символом в строке и если это так, замените его символом #. Может быть, мы преобразовываемTweet ответы в хэш-теги по некоторым причинам. С применением строковых функций это может выглядеть примерно так:

if ( 0 === strpos( $string, '@' ) ) {     $string = '#' . substr( $string, 1 ); } 

Но с помощью регулярных выражений этого же можно добиться более кратко:

$string = preg_replace( '/^@/', '#', $string ); 

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

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

$length = strlen( $string ); if ( 0 === strpos( $string, '@' ) && $length - 1 === strrpos( $string, '@' ) ) {     $string = '#' . substr( $string, 1, $length - 1 ) . '#'; } 

Наше регулярное выражение же изменяется незначительно:

$string = preg_replace( '/^@(.*)@$/', '#$1#', $string ); 

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

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

Перевод

ссылка на оригинал статьи http://habrahabr.ru/post/180967/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *