Насколько важно знать регулярные выражения? - PullRequest
8 голосов
/ 06 февраля 2009

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

Тем не менее.

Ряд ответов на повторяющееся "Что это за регулярное выражение?" Типовые вопросы предполагают, что многие кодеры находят их где-то между неразборчивым и непрозрачным.

Дело не в том, является ли простое indexOf или подстрока лучшим решением, это технический вопрос, и иногда простой способ верен, иногда регулярное выражение, а иногда и нет (смотря на ваши вопросы парсера html).

Речь идет о том, насколько важно понимать Regexs и является ли мнение анти-Regex (что банально «... теперь у них две проблемы») заслугой или FUD.

Должен ли программист понимать Regexs? Это необходимый навык?


редактировать: на всякий случай неясно, я не спрашиваю, нужно ли I их изучать (я защитник веры), но нужен ли анти-лагерь Есть эволюционный тупик или это ненужный нишевый навык, такой как InstallShield .

Ответы [ 16 ]

26 голосов
/ 06 февраля 2009

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

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

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

18 голосов
/ 06 февраля 2009

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

В общем, я думаю об использовании регулярного выражения, когда задействован фактический шаблон . Если вы просто ищете конкретную строку, я бы не стал использовать регулярное выражение. Как пример серой области, кто-то однажды спросил в группе новостей лучший способ проверить, содержит ли одна строка какую-либо из ряда других строк. Два способа, которые пришли, были:

  • Создайте регулярное выражение с альтернативами и выполните одно совпадение.
  • Проверьте каждую строку по очереди с string.Contains.

Лично я думаю, что последний способ намного проще - он не требует каких-либо мыслей об экранировании искомых строк или каких-либо других знаний о регулярных выражениях (и их различных разновидностях в разных платформы).

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

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

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

РЕДАКТИРОВАТЬ: В ответ на редактирование вопроса ...

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

Лично мне нравится комментировать мои регулярные выражения довольно подробно, разбивая их на несколько строк с комментариями между каждой строкой. Таким образом, их легче поддерживать, и не похоже, что вы просто пытаетесь быть «жестким ядром» (это может показаться , даже если это не настоящая намеченная цель) .

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

6 голосов
/ 06 февраля 2009

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

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

3 голосов
/ 06 февраля 2009

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

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

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

3 голосов
/ 06 февраля 2009

В статье Стива Йегге, Пять основных вопросов на экране телефона , вы должны прочитать раздел «Область номер три: сценарии и регулярные выражения».

У Стива Йегге есть несколько интересных моментов. Он рассказывает о реальных проблемах, с которыми он сталкивался, когда клиентам приходилось анализировать 50000 файлов по определенному шаблону телефонного номера. Заявители, которые знают регулярные выражения, через несколько минут разбираются с проблемой, в то время как те, кто не пишут многостраничных монстр-программ, очень громоздки. Эта статья убедила меня, что я должен изучать регулярные выражения.

2 голосов
/ 06 февраля 2009

Я думаю, что знание регулярного выражения - довольно важный навык. Хотя использование регулярных выражений в среде программирования / языке является вопросом поддерживаемого кода, я считаю, что знание регулярных выражений полезно для некоторых команд (например, egrep), редакторов (vim, emacs и т. Д.). Использование регулярных выражений для поиска и замены в vim очень удобно, когда у вас есть текстовый файл, и вы хотите время от времени выполнять некоторое форматирование.

2 голосов
/ 06 февраля 2009

Тот факт, что все языки поддерживают регулярные выражения, должен означать что-то !

2 голосов
/ 06 февраля 2009

Когда вам нужно что-то проанализировать (от простых строк дат до языков программирования), вы должны знать, что ваши инструменты и регулярные выражения являются одним из них.

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

2 голосов
/ 06 февраля 2009

Не ясно, какого ответа вы ожидаете.

Я могу представить примерно три вида ответа на этот вопрос:

  1. Регексены необходимы для обучения профессиональных программистов. Они позволяют использовать мощные инструменты оболочки Unix, а поиск-замена на основе регулярных выражений может значительно сократить ручную работу по обработке текста, являющуюся частью жизни программиста. Программисты, которые не знают регулярных выражений, просто ленивые в интерактивном режиме, что является очень плохой чертой для программиста.

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

  3. Некоторым психам нравится помещать все регулярные выражения (я смотрю на вас, парня Perl, который внедрил основанный на регулярных выражениях тетрис в Perl). Но на самом деле это всего лишь мелочи компьютерных наук, единственное практическое применение которых - написание синтаксических анализаторов. Их широко преподают, потому что они составляют хорошую учебную тему для оценки учащихся, и, как и большинство таких тем, они могут забыть, как только вы выходите из экзаменационной комнаты.

Вы заметите осторожное использование множественных форм "regexen" (pro), "regexps" (тщательно нейтральный) и "regexs" (con).

Лично я первого рода. Хорошие программисты любят изучать новые языки, и они ненавидят повторяющиеся ручные работы.

2 голосов
/ 06 февраля 2009

Не блестящий ответ, но везде, где я работал, верно следующее:

0 <Количество людей, которые (полностью) понимают регулярное выражение <1 </p>

Если бы я знал, как это сделать, я бы написал это предыдущее выражение как регулярное выражение, но я не могу. Лучшее, что я могу придумать на лету, это s / полностью / немного / g - это мой предел (и это, вероятно, не регулярное выражение).

Более серьезным ответом является то, что правильное регулярное выражение решит все виды проблем с помощью одной (ish) строки кода. Но у вас будут реальные проблемы с отладкой, если что-то пойдет не так. Поэтому ИМХО сложное регулярное выражение, однако «чистый / умный» - это ответственность, если для его репликации требуется десять строк кода, то почему проблема в том, что память / дисковое пространство внезапно снова дорого?

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

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