Подтвердить что ты не робот

Если не использовать Regex в С# (или Java, С++ и т.д.),

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

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

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Существует два аспекта:

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

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

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

Ответ 7

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

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

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

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