Вопрос

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

В будущем нам также потребуется поддерживать больше «форматов».

Идем ли мы за решением, используя:

  • регулярное выражение
  • Просто поиск строк (с использованием string.IndexOf и т. д.)
  • Лекс/Якк
  • Другой

Общее решение будет разработано на C# 2.0 (надеюсь, 3.5).

Это было полезно?

Решение

Каждое из трех предложенных вами решений охватывает совершенно разные потребности.

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

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

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

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

Как альтернатива, Как заметил Вайбхав, если у вас может возникнуть несколько различных ситуаций и вы не можете легко определить, какая из них произойдет, вы можете создать систему плагинов, которая выбирает правильный алгоритм, и все эти алгоритмы могут быть очень разными, один из которых использует Lex. /Yacc в острых случаях, а другой — с использованием IndexOf и регулярного выражения для более простых случаев.

Другие советы

Регулярное выражение.

Regex может решить практически все, кроме мира во всем мире.Ну, может быть, и мир во всем мире.

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

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

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

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

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

Это зависит от того, что вы анализируете.Для всего, что выходит за рамки того, с чем может справиться Regex, я использовал АНТЛР.Прежде чем вы впервые приступите к анализу рекурсивного спуска, я бы изучил, как они работают, прежде чем пытаться использовать такую ​​структуру.Если вы подписаны на журнал MSDN Magazine, прочтите выпуск за февраль 2008 года, где есть статья о написании журнала с нуля.

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

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

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

Хотя вы могли бы использовать IndexOf чтобы справиться с чем-то, вы можете быстро написать код, который выглядит примерно так:

if(s.IndexOf("search1")>-1 || s.IndexOf("search2")>-1 ||...

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

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

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

Используйте PCRE.Все остальные ответы только 2-е место.

Учитывая предоставленную вами небольшую информацию, я бы выбрал Regex.

Но то, какую информацию вы хотите проанализировать и что вы хотите сделать, возможно, изменит решение на Lex/Yacc..

Но похоже, что вы уже определились со строковым поиском :)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top