Quelles sont les différentes méthodes pour analyser des chaînes en Java ?[fermé]

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

  •  08-06-2019
  •  | 
  •  

Question

Pour analyser les commandes du joueur, j'ai le plus souvent utilisé le diviser méthode pour diviser une chaîne par délimiteurs, puis pour comprendre le reste par une série de ifs ou switches.Quelles sont les différentes manières d’analyser des chaînes en Java ?

Était-ce utile?

La solution

Je suppose que vous essayez de rendre l'interface de commande aussi indulgente que possible.Si tel est le cas, je vous suggère d'utiliser un algorithme similaire à celui-ci :

  1. Lire dans la chaîne
    • Divisez la chaîne en jetons
    • Utiliser un dictionnaire pour convertir les synonymes en une forme commune
    • Par exemple, convertissez "hit", "punch", "strike" et "kick" en "hit".
    • Effectuer des actions sur une base désordonnée et inclusive
    • Non commandé - "frapper le singe au visage" est la même chose que "le visage dans le coup de poing du singe"
    • Compris - Si la commande est censée être "frapper le singe au visage" et qu'ils fournissent "punch singe", vous devez vérifier à combien de commandes cela correspond.S'il n'y a qu'une seule commande, effectuez cette action.Cela pourrait même être une bonne idée d'avoir des priorités de commandement, et même s'il y avait des matchs égaux, ce serait l'action la plus importante.

Autres conseils

J'aime beaucoup les expressions régulières.Tant que les chaînes de commande sont assez simples, vous pouvez écrire quelques expressions rationnelles qui pourraient prendre quelques pages de code à analyser manuellement.

Je vous suggère de vérifier http://www.regular-expressions.info pour une bonne introduction aux expressions régulières, ainsi que des exemples spécifiques pour Java.

L'analyse manuelle est très amusante...au début:)

En pratique, si les commandes ne sont pas très sophistiquées, vous pouvez les traiter de la même manière que celles utilisées dans les interpréteurs de ligne de commande.Il existe une liste de bibliothèques que vous pouvez utiliser : http://java-source.net/open-source/command-line.Je pense que tu peux commencer par Apache Commons CLI ou args4j (utilise des annotations).Ils sont bien documentés et très simples à utiliser.Ils gèrent l'analyse automatiquement et la seule chose que vous devez faire est de lire des champs particuliers dans un objet.

Si vous disposez de commandes plus sophistiquées, créer une grammaire formelle serait peut-être une meilleure idée.Il existe une très bonne bibliothèque avec éditeur graphique, débogueur et interpréteur de grammaires.C'est appelé ANTLR (et l'éditeur ANTLRWorks) et c'est gratuit :) Il y a aussi quelques exemples de grammaires et de tutoriels.

je regarderais Migration Java de Zork, et penchez-vous vers un simple Processeur de langage naturel (piloté soit par tokenisation, soit par regex) comme ce qui suit (à partir de ce lien) :

    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;
    }

...

Tout ce qui donne à un programmeur une raison de revoir Zork est bon dans mon livre, faites juste attention à Grues.

...

Sun lui-même recommande de rester à l'écart de StringTokenizer et d'utiliser plutôt la méthode String.spilt.

Vous voudrez également consulter la classe Pattern.

Un autre vote pour ANTLR/ANTLRWorks.Si vous créez deux versions du fichier, une avec le code Java pour exécuter réellement les commandes et une sans (avec juste la grammaire), alors vous disposez d'une spécification exécutable du langage, ce qui est idéal pour les tests, une aubaine pour la documentation. , et un gain de temps considérable si jamais vous décidez de le porter.

Si c'est pour analyser les lignes de commande, je suggérerais d'utiliser Commons CLI.

La bibliothèque Apache Commons CLI fournit une API pour traiter les interfaces de ligne de commande.

Essayer JavaCC un générateur d'analyseur pour Java.

Il possède de nombreuses fonctionnalités pour interpréter les langages et est bien pris en charge sur Eclipse.

@CodingTheWheel Voici votre code, un peu nettoyé et via Eclipse (Ctrl+changement+F) et l'inséré ici :)

Y compris les quatre espaces devant chaque ligne.

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;
}

Un simple tokeniseur de chaîne sur les espaces devrait fonctionner, mais il existe de nombreuses façons de le faire.

Voici un exemple utilisant un 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);
}

Les jetons peuvent ensuite être utilisés pour les arguments.Tout cela suppose qu'aucun espace n'est utilisé dans les arguments...vous souhaiterez peut-être lancer votre propre mécanisme d'analyse simple (comme obtenir le premier espace et utiliser le texte avant comme action, ou utiliser une expression régulière si la vitesse ne vous dérange pas), il suffit de l'abstraire pour qu'il puisse être utilisé n'importe où.

Lorsque la chaîne de séparation de la commande est toujours la même chaîne ou le même caractère (comme le ";"), nous vous recommandons d'utiliser la classe StrinkTokenizer :

StringTokenizer

mais lorsque le séparateur varie ou est complexe, nous vous recommandons d'utiliser les expressions régulières, qui peuvent être utilisées par la classe String elle-même, méthode split, depuis 1.4.Il utilise la classe Pattern du package java.util.regex

Modèle

Si le langage est très simple comme juste

VERBE NOM

puis le fractionnement à la main fonctionne bien.

Si c'est plus complexe, vous devriez vraiment vous tourner vers un outil comme ANTLR ou JavaCC.

J'ai un tutoriel sur ANTLR (v2) sur http://javadude.com/articles/antlrtut ce qui vous donnera une idée de son fonctionnement.

JCommandant Cela semble plutôt bien, même si je ne l'ai pas encore testé.

Si votre texte contient des délimiteurs, vous pouvez alors split méthode.
Si le texte contient des chaînes irrégulières signifie un format différent, vous devez utiliser regular expressions.

La méthode split peut diviser une chaîne en un tableau de l'expression de sous-chaîne spécifiée regex.Ses arguments sous deux formes, à savoir :diviser (String regex) et divisé (String regex, int limit), qui divise (String regex) consiste en fait à appeler split (String regex, int limit) pour obtenir, la limite est 0.Puis, lorsque le limite> 0 et limite <0 représente quoi ?

Quand le jdk expliqué:quand limite> 0 longueurs de sous-réseau jusqu'à la limite, c'est-à-dire, si possible, peuvent être limite-1 sous-division, restant sous forme de sous-chaîne (sauf dans la limite d'une fois le caractère a une fin de chaîne divisée) ;

limite <0 n'indique aucune limite sur la longueur du tableau ;

limite = 0 fin de la chaîne, la chaîne vide sera tronquée.StringTokenizer la classe est pour des raisons de compatibilité et est une classe héritée préservée, nous devrions donc essayer d'utiliser la méthode split de la classe String.faire référence à lien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top