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

votos
43

Para analisar comandos do jogador, eu tenho mais frequentemente usado a separação método para dividir uma string por delimitadores e, em seguida, para em seguida, basta descobrir o resto por uma série de ifs ou switches. Quais são algumas maneiras diferentes de analisar cadeias de caracteres em Java?

Publicado 06/08/2008 em 00:49
fonte usuário
Em outras línguas...                            


15 respostas

votos
19

Eu realmente gosto de expressões regulares. Enquanto as cadeias de comando são bastante simples, você pode escrever algumas expressões regulares que poderia tomar algumas páginas de código para analisar manualmente.

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

Respondeu 06/08/2008 em 00:54
fonte usuário

votos
14

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

  1. Leia na cadeia
    • Dividir a string em tokens
    • Use um dicionário para converter sinônimos para uma forma comum
    • Por exemplo, converter "hit", "punch", "greve" e "kick" todos "hit"
    • Executar ações em uma base não-ordenada, inclusive
    • Não ordenada - "perfurar o macaco na cara" é a mesma coisa que "o rosto no soco macaco"
    • Inclusive - Se o comando é suposto ser "perfurar o macaco na cara" e eles contam com "Monkey Punch", você deve verificar quantos comandos isso corresponde. Se apenas um comando, fazer esta ação. Pode até ser uma boa idéia ter prioridades de comando, e mesmo que não foram sequer corresponde, seria realizar a ação superior.
Respondeu 06/08/2008 em 01:42
fonte usuário

votos
13

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

Na prática, se os comandos não são muito sofisticados você pode tratá-los da mesma maneira como aqueles usados em intérpretes de linha de comando. 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 realmente simples de usar. Eles lidam com a análise automática e a única coisa que você precisa fazer é ler campos específicos em um objeto.

Se você tem comandos mais sofisticados, então talvez criando uma gramática formal seria uma idéia melhor. Há uma boa biblioteca com editor gráfico, depurador e intérprete para gramáticas. É chamado ANTLR (eo editor ANTLRWorks ) e é grátis :) Há também alguns exemplos de gramáticas e tutoriais.

Respondeu 30/08/2008 em 23:26
fonte usuário

votos
7

Eu olhava para as migrações Java de Zork , e inclinar-se para um simples processador de linguagem natural (accionado por tokenizing ou regex), como o seguinte (a partir deste link):

    public boolean simpleNLP estática (String inputline, palavras-chave String [])
    {
        int i;
        int maxToken = keywords.length;
        int para, a partir de;
        if (inputline.length () = inputline.length ()) return false; // verificar se há linhas em branco e vazios
        while (a> = 0)
        {
            a = inputline.indexOf ('', a partir de);
            if (a> 0) {
                lexed.addElement (inputline.substring (a partir de, a));
                de = a;
                enquanto (inputline.charAt (dos) == ''
                && a partir = keywords.length) {status = true; pausa;}
            }
        }
        status de retorno;
    }

...

Qualquer coisa que dá um programador um motivo para olhar para Zork novamente é bom no meu livro, apenas atente para Grues.

...

Respondeu 06/08/2008 em 01:16
fonte usuário

votos
6

Outro voto para ANTLR / ANTLRWorks. Se você criar duas versões do arquivo, um com o código Java para realmente executar os comandos, e um sem (com apenas a gramática), então você tem uma especificação executável da língua, o que é ótimo para testes, uma benção para documentação e uma grande economia de tempo, se você decidir porta-lo.

Respondeu 31/08/2008 em 02:38
fonte usuário

votos
6

próprio sol recomenda ficar longe de StringTokenizer e usando o método String.spilt vez.

Você também vai querer olhar para a classe padrão.

Respondeu 06/08/2008 em 17:14
fonte usuário

votos
4

Tente JavaCC um gerador de analisador para Java.

Ele tem um monte de recursos para interpretar línguas, e é bem suportado no Eclipse.

Respondeu 31/08/2008 em 20:45
fonte usuário

votos
4

Se este for para analisar linhas de comando, sugiro usar Commons CLI .

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

Respondeu 31/08/2008 em 02:05
fonte usuário

votos
2

@CodingTheWheel Heres seu código, um pouco limpar e através eclipse ( ctrl+ shift+ f) eo inserido 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;
}
Respondeu 06/08/2008 em 16:18
fonte usuário

votos
1

método de separação pode dividir uma cadeia de caracteres em uma matriz de expressão a subcadeia especificado regex. Seus argumentos em duas formas, a saber: split ( String regex) e split ( String regex, int limit), que split ( String regex) é realmente chamando divisão (String regex, limite int) para alcançar, limite é 0 . Então, quando o limite> 0 e limite <0 representa o que?

Quando o jdk explicado: quando limite> 0 sub-matriz um comprimento máximo de limitar, ou seja, se possível, podem ser limite-1 sub-divisão, permanecendo como uma subsequência (excepto pelo limite-1 vezes o personagem corda dividido final) ;

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

limite = 0 fim da cadeia vazio cadeia será truncada. StringTokenizerclasse é por razões de compatibilidade e é preservada classe legado, por isso, devemos tentar usar o método split da classe String. referem-se a vincular

Respondeu 13/05/2014 em 15:13
fonte usuário

votos
1

Se seu texto contém alguns delimitadores então você pode o seu splitmétodo.
Se o texto contém cadeias irregulares significa formato diferente nele, então você deve usar regular expressions.

Respondeu 24/11/2012 em 10:17
fonte usuário

votos
1

JCommander parece muito bom, embora eu ainda tenho que testá-lo.

Respondeu 20/08/2010 em 14:59
fonte usuário

votos
1

Se a linguagem é simples morto como apenas

VERBO SUBSTANTIVO

em seguida, dividindo a mão funciona bem.

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

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

Respondeu 16/09/2008 em 16:35
fonte usuário

votos
1

Quando a corda separador para o comando é allways a mesma string ou char (como o ";") y recomendo você usa a classe StrinkTokenizer:

StringTokenizer

mas quando o separador varia ou é complexa y recomendo que você use os expresions regulares, que podem ser utilizadas pela própria classe String, método split, desde 1.4. Ele usa a classe padrão do pacote java.util.regex

padronizar

Respondeu 06/08/2008 em 16:40
fonte usuário

votos
1

A tokenizer simples string em espaços devem funcionar, mas há realmente muitas maneiras que você poderia fazer isso.

Aqui está um exemplo usando um tokenizer:

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

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

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

Então tokens podem ainda ser utilizados para os argumentos. Isso tudo pressupõe espaços não são usados ​​nos argumentos ... então você pode querer rolar o seu próprio mecanismo de análise simples (como obter o primeiro espaço em branco e usando texto antes que a ação, ou usando uma expressão regular, se você não se importa o hit velocidade), apenas abstract-lo para que ele possa ser usado em qualquer lugar.

Respondeu 06/08/2008 em 00:57
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more