Quais são os diferentes métodos para analisar cadeias de caracteres em Java?[fechado]

StackOverflow https://stackoverflow.com/questions/2968

  •  08-06-2019
  •  | 
  •  

Pergunta

Para a análise de comandos do jogador, eu mais tenho usado frequentemente a divisão método para dividir uma seqüência de caracteres delimitadores e, em seguida, para, em seguida, apenas descobrir o resto por uma série de ifs ou switches.Quais são algumas maneiras diferentes de análise de cadeias de caracteres em Java?

Foi útil?

Solução

Eu suponho que você está tentando fazer com que a interface de comando como perdoar possível.Se este for o caso, eu sugiro que você use um algoritmo semelhante a este:

  1. Leia na cadeia
    • Dividir a seqüência de caracteres em tokens
    • Use um dicionário para converter sinónimos para uma forma comum
    • Por exemplo, converter "hit", "punch", "greve", e "chutar" para "acertar"
    • Executar ações em uma desordenada, inclusive da base de dados
    • Não ordenado - "soco no macaco na cara" é a mesma coisa que "o rosto no monkey punch"
    • Inclusiva - Se o comando é suposto ser "soco no macaco na cara" e de fornecimento de "soco macaco", você deve verificar quantos comandos este partidas.Se apenas um comando, fazer esta ação.Pode até ser uma boa idéia ter o comando de prioridades, e mesmo se houvesse mesmo corresponde, ele iria realizar a acção.

Outras dicas

Eu realmente gosto de expressões regulares.Enquanto as seqüências de comandos são bastante simples, você pode escrever algumas regexes que poderia levar algumas páginas de código para analisar manualmente.

Eu sugiro que você confira http://www.regular-expressions.info para uma boa introdução para regexes, bem como exemplos específicos para Java.

Analisar manualmente, é muito divertido...no início:)

Na prática, se os comandos não são muito sofisticado, você pode tratá-los da mesma forma como aqueles usados na linha de comando intérpretes.Há uma lista de bibliotecas que você pode usar: http://java-source.net/open-source/command-line.Eu acho que você pode começar com apache commons CLI ou args4j (usa anotações).Eles estão bem documentados e muito simples de usar.Eles lidam com a análise automaticamente e a única coisa que você precisa fazer é ler campos em particular em um objeto.

Se você tiver mais sofisticados comandos e, em seguida, talvez a criação de uma gramática formal seria uma idéia melhor.Há uma biblioteca muito boa com editor gráfico, depurador e intérprete de gramáticas.É chamado de ANTLR (e o editor ANTLRWorks) e é gratuita:) Existem também alguns exemplos de gramáticas e tutoriais.

Eu olhava para Java migrações de Zork, e inclinar-se para um simples Processador De Linguagem Natural (dirigido por simbolização ou regex), como a seguir (neste link):

    public static boolean simpleNLP( String inputline, String keywords[])
    {
        int i;
        int maxToken = keywords.length;
        int to,from;
        if( inputline.length() = inputline.length()) return false; // check for blank and empty lines
        while( to >=0 )
        {
            to = inputline.indexOf(' ',from);
            if( to > 0){
                lexed.addElement(inputline.substring(from,to));
                from = to;
                while( inputline.charAt(from) == ' '
                && from = keywords.length) { status = true; break;}
            }
        }
        return status;
    }

...

Qualquer coisa que dá um programador de uma razão para olhar para Zork novamente é boa no meu livro, apenas atente para Grues.

...

Sol em si recomenda ficar longe de StringTokenizer e usando a Seqüência de caracteres.derramado método vez.

Você também vai querer olhar para o Padrão de classe.

Mais um voto para o ANTLR/ANTLRWorks.Se você criar duas versões do arquivo, uma com o código Java para executar os comandos, e um sem (apenas com a gramática), então você tem uma especificação executável do idioma, o que é ótimo para testar, uma vantagem para documentação, e uma grande economia de tempo se você decidir para a porta.

Se esta é analisar linhas de comando gostaria de sugerir o uso O Commons Cli.

O Apache Commons CLI biblioteca fornece uma API para processamento de interfaces de linha de comando.

Tente JavaCC um gerador de analisador para Java.

Ele tem um monte de recursos para a interpretação de línguas, e ele é bem suportado no Eclipse.

@CodingTheWheel Aqui está o seu código, um pouco de limpeza e através de eclipse (ctrl+mudança+f) e inserido de volta aqui :)

Incluindo os quatro espaços na frente de cada linha.

public static boolean simpleNLP(String inputline, String keywords[]) {
    if (inputline.length() < 1)
        return false;

    List<String> lexed = new ArrayList<String>(); 
    for (String ele : inputline.split(" ")) {
        lexed.add(ele);
    }


    boolean status = false;
    to = 0;
    for (i = 0; i < lexed.size(); i++) {
        String s = (String) lexed.get(i);
        if (s.equalsIgnoreCase(keywords[to])) {
            to++;
            if (to >= keywords.length) {
                status = true;
                break;
            }
        }
    }
    return status;
}

Uma simples seqüência de lexemas em espaços devem funcionar, mas na verdade existem muitas maneiras de fazer isso.

Aqui está um exemplo usando um lexemas:

String command = "kick person";
StringTokenizer tokens = new StringTokenizer(command);
String action = null;

if (tokens.hasMoreTokens()) {
    action = tokens.nextToken();
}

if (action != null) {
    doCommand(action, tokens);
}

Em seguida, os tokens podem ser usados posteriormente para os argumentos.Tudo isso assume nenhuma espaços são utilizados nos argumentos...então você pode querer construir sua própria análise simples mecanismo (como recebendo o primeiro espaço em branco e usar o texto antes, como a ação, ou, usando uma expressão regular, se você não mente a perda de velocidade), apenas abstrato-lo de modo que ele pode ser usado em qualquer lugar.

Quando o separador de Seqüência do comando é sempre o mesmo String ou char (como o ";") y recomendamos que você use o StrinkTokenizer classe:

StringTokenizer

mas quando o separador varia ou é complexo y recomendamos que você use o regular expresions, que pode ser usado pela classe String em si, o método de divisão, desde a versão 1.4.Ele usa o Padrão de classe de java.util.pacote regex

Padrão

Se o idioma está morto, simples assim

VERBO SUBSTANTIVO

em seguida, dividindo pela mão funciona bem.

Se é mais complexo, você deve realmente olhar para uma ferramenta como o ANTLR ou JavaCC.

Eu tenho um tutorial sobre o ANTLR (v2) em http://javadude.com/articles/antlrtut o que lhe dará uma idéia de como ele funciona.

JCommander parece muito bom, apesar de eu ainda tenho que testar.

Se o texto contém alguns delimitadores, em seguida, você pode a sua split o método.
Se o texto contém irregular de cadeias de meios diferentes do formato em que, então, você deve usar regular expressions.

método de divisão pode dividir uma string em um array de um substring especificada expressão regex.Seus argumentos em duas formas, a saber:split (String regex) e split (String regex, int limit), que se dividem (String regex) é, na verdade, chamando split (String regex, int limite) para alcançar, o limite é 0.Em seguida, quando o limite> 0 e limite de <0 representa o que?

Quando o jdk explicou:quando limite> 0 sub-matriz de comprimentos até o limite, que é, se possível, pode ser limite de 1 sub-divisão, permanecendo como uma substring (exceto pelo limite-1 vezes o personagem tem a string split end);

limite de <0 indica que não há limite para o comprimento da matriz;

limite = 0 final da seqüência de caracteres vazia seqüência de caracteres será truncada.StringTokenizer classe é, por razões de compatibilidade e está preservado o legado de classe, por isso devemos tentar usar o método de divisão da classe String.consulte link

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