Pergunta

Temos um cenário que exige que analisemos muitos e-mails (texto simples), cada 'tipo' de e-mail é o resultado de um script sendo executado em várias plataformas.Alguns são delimitados por tabulações, alguns são delimitados por espaço, alguns simplesmente não conhecemos ainda.

Precisaremos oferecer suporte a mais 'formatos' no futuro também.

Vamos para uma solução usando:

  • Regex
  • Simplesmente pesquisa de string (usando string.IndexOf etc)
  • Lex/ Yacc
  • Outro

A solução geral será desenvolvida em C# 2.0 (esperançosamente 3.5)

Foi útil?

Solução

As três soluções que você declarou cobrem necessidades muito diferentes.

Análise manual (pesquisa de texto simples) é o mais flexível e adaptável, no entanto, rapidamente se torna um verdadeiro pé no saco, pois a análise necessária é mais complicada.

Regex são um meio-termo e provavelmente sua melhor aposta aqui.Eles são poderosos, mas flexíveis, pois você mesmo pode adicionar mais lógica do código que chama os diferentes regex.A principal desvantagem seria a velocidade aqui.

Lex/Yacc é realmente adaptado apenas para sintaxes muito complicadas e previsíveis e carece de muita flexibilidade pós-compilação.Você não pode alterar facilmente o analisador no meio da análise, bem, na verdade você pode, mas é muito pesado e seria melhor usar regex.

Eu sei que isso é um clichê responder, tudo se resume a quais são suas necessidades exatas, mas pelo que você disse, eu pessoalmente provavelmente escolheria um saco de regex.

Como um alternativa, como Vaibhav apontou, se você tiver várias situações diferentes que podem surgir e não puder detectar facilmente qual delas está chegando, você pode criar um sistema de plugins que escolha o algoritmo certo, e esses algoritmos podem ser todos muito diferentes, um usando Lex /Yacc em casos pontiagudos e outro usando IndexOf e regex para casos mais simples.

Outras dicas

Regex.

Regex pode resolver quase tudo, exceto a paz mundial.Bem, talvez a paz mundial também.

Você provavelmente deve ter um sistema conectável, independentemente do tipo de análise de string usado.Portanto, este sistema recorre ao 'plugin' correto dependendo do tipo de e-mail para analisá-lo.

Você deve arquitetar sua solução para ser atualizável, para que possa lidar com situações desconhecidas quando elas surgirem.Crie uma interface para analisadores que contenha não apenas métodos para analisar os e-mails e retornar resultados em um formato padrão, mas também para examinar o e-mail para determinar se o analisador será executado.

Dentro da sua configuração, identifique o tipo de analisador que deseja usar, defina suas opções de configuração e a configuração dos identificadores que determinam se um analisador atuará ou não.Nomeie os analisadores pelo nome qualificado do assembly para que os tipos possam ser instanciados em tempo de execução, mesmo que não haja links estáticos para seus assemblies.

Os identificadores também podem implementar uma interface, para que você possa criar diferentes tipos que verificam coisas diferentes.Por exemplo, você pode criar um identificador regex, que analisa o e-mail em busca de um padrão específico.Certifique-se de disponibilizar o máximo de informações ao identificador, para que ele possa tomar decisões sobre coisas como endereços e também sobre o conteúdo do e-mail.

Quando seus analisadores conhecidos não conseguem lidar com um trabalho, crie uma nova DLL com tipos que implementem as interfaces do analisador e do identificador que podem lidar com o trabalho e solte-os no diretório bin.

Depende do que você está analisando.Para qualquer coisa além do que o Regex pode suportar, tenho usado ANTLR.Antes de você entrar na análise descendente recursiva pela primeira vez, eu pesquisaria como elas funcionam, antes de tentar usar uma estrutura como esta.Se você assina a MSDN Magazine, verifique a edição de fevereiro de 2008, onde há um artigo sobre como escrever uma do zero.

Depois de entender, aprender ANTLR será muito mais fácil.Existem outras estruturas por aí, mas o ANTLR parece ter o maior apoio da comunidade e documentação pública.O autor também publicou A referência definitiva do ANTLR:Construindo linguagens específicas de domínio.

Regex provavelmente seria sua aposta, testada e comprovada.Além disso, uma expressão regular pode ser compilada.

Sua melhor aposta é RegEx porque oferece um grau de flexibilidade muito maior do que qualquer uma das outras opções.

Embora você possa usar IndexOf para lidar com algumas coisas, você pode rapidamente escrever um código semelhante a:

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

Isso pode ser tratado em uma instrução RegEx.Além disso, há muitos lugares como RegExLib. com onde você pode encontrar pessoas que compartilharam expressões regulares para resolver problemas.

@Coincoin cobriu as bases;Só quero acrescentar que com regex é particularmente fácil acabar com código difícil de ler e manter.Regex é uma linguagem poderosa e muito compacta, e é assim que costuma acontecer.

Usar espaços em branco e comentários dentro da regex pode ajudar muito a facilitar a manutenção de regexes.Eric Gunnerson me mostrou essa ideia.Aqui está um exemplo.

Utilize PCRE.Todas as outras respostas são apenas a segunda melhor.

Com tão poucas informações que você forneceu, eu escolheria Regex.

Mas que tipo de informação você deseja analisar e o que você gostaria de fazer mudará a decisão para Lex/Yacc, talvez.

Mas parece que você já se decidiu com a pesquisa por String :)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top