Когда не использовать Regex в C # (или Java, C ++ и т. Д.) - PullRequest
19 голосов
/ 09 июня 2009

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

Итак, как кто-то, кто не является экспертом по регулярным выражениям , узнает, должен ли он / она изучать регулярные выражения для решения данной проблемы?

(См. "Regex для синтаксического анализа исходного кода C # для поиска всех строк" для способа, которым я задаю этот вопрос.)

Кажется, это хорошо подводит итог:

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

(Я только что изменил название вопроса, чтобы сделать его более конкретным, поскольку некоторые проблемы с Regex в C # решаются в Perl и JScript, например, тот факт, что два уровня цитирования делают Regex таким нечитаемым .)

Ответы [ 7 ]

14 голосов
/ 09 июня 2009

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

Используйте для этого генераторы парсеров (или аналогичные технологии).

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

4 голосов
/ 09 июня 2009

Есть два аспекта для рассмотрения:

  • Возможность: является ли язык, который вы пытаетесь распознать, языком типа 3 (обычным)? если это так, то вы можете использовать регулярные выражения, если нет, вам нужен более мощный инструмент.

  • Ремонтопригодность: если для написания, проверки и понимания регулярного выражения требуется больше времени, чем для его программного аналога, это не подходит. Как это проверить - сложно, я бы порекомендовал коллегам ознакомиться с коллегами (если они увидят «что ...», когда они это увидят, тогда это слишком сложно), или просто оставлю это без документов на несколько дней, а затем возьму посмотрите сами и оцените, сколько нужно времени, чтобы понять это.

1 голос
/ 09 июня 2009

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

Для конкретной проблемы попробуйте найти решение на сайте, подобном regexlib , и посмотрите, сможете ли вы понять решение.

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

0 голосов
/ 09 июня 2009

Основная проблема здесь - ремонтопригодность.

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

С другой стороны, следует учитывать, что поддержание кода на основе регулярных выражений (написанного на любом языке) может стать кошмаром даже для тех, кто действительно хорош в них. Поэтому, на мой взгляд, правильный подход заключается в том, чтобы использовать их только тогда, когда это неизбежно и когда код, использующий регулярное выражение, будет более читабельным, чем его вариант без регулярного выражения. И, конечно, как уже указывалось, не используйте их для чего-то, чего они не должны делать (например, xml). И никакой проверки адреса электронной почты тоже (одна из моих любимых мозолей: P)!

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

0 голосов
/ 09 июня 2009

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

  • Идентификация частей строки.
  • Проверка соответствия строки определенному формату или конструкции.
  • Поиск подстрок, соответствующих определенному шаблону.
  • Преобразование строк, которые соответствуют определенному шаблону, в другую форму (поиск-замена, использование заглавных букв и т. Д.).

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

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

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

0 голосов
/ 09 июня 2009

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

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

0 голосов
/ 09 июня 2009

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

Посмотрите на этот вопрос - который показывает вам элегантность регулярного выражения в отличие от аналогичной конструкции if () ...

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