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

Translate

Pour analyser les commandes du lecteur, j'ai le plus souvent utiliséDiviséméthode pour diviser une chaîne par des délimiteurs, puis simplement comprendre le reste par une série deifs ouswitches. Quelles sont les différentes manières d'analyser les chaînes en Java?

This question and all comments follow the "Attribution Required."

Toutes les réponses

Translate

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. Read in the string
    • Divisez la chaîne en jetons
    • Utilisez un dictionnaire pour convertir des synonymes en une forme commune
    • Par exemple, convertissez "hit", "punch", "strike" et "kick" all en "hit"
    • Effectuer des actions sur une base non ordonnée et inclusive
    • Non ordonné- "frapper le singe au visage" est la même chose que "frapper le singe au visage"
    • Compris- Si la commande est censée être "punch the monkey in the face" et qu'elle fournit "punch monkey", vous devriez vérifier combien de commandes cela correspond. S'il s'agit d'une seule commande, effectuez cette action. Cela pourrait même être une bonne idée d'avoir des priorités de commande, et même s'il y avait même des correspondances, cela effectuerait l'action supérieure.
La source
Translate

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

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

La source
Translate

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 parCLI apache commonsouargs4j(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 avez des 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 un éditeur graphique, un débogueur et un interpréteur de grammaires. C'est appeléANTLR(et l'éditeurANTLRWorks) et c'est gratuit :) Il y a aussi quelques exemples de grammaires et de tutoriels.

La source
Myra Lee
Translate

Je regarderaisMigrations JavadeZork, et penchez-vous vers un simpleProcesseur de langage naturel(piloté soit par tokenizing ou 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 attention à Grues.

...

La source
Translate

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

Vous voudrez également examiner la classe Pattern.

La source
Translate

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 avez 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 vous décidez de le porter.

La source
SaM
Translate

Si c'est pour analyser les lignes de commande, je suggérerais d'utiliserCommons Cli.

La bibliothèque CLI Apache Commons fournit une API pour le traitement des interfaces de ligne de commande.

La source
Translate

EssayerJavaCCun générateur d'analyseur pour Java.

Il a beaucoup de fonctionnalités pour interpréter les langues, et il est bien pris en charge sur Eclipse.

La source
Translate

@CodingTheWheel Voici votre code, un peu nettoyer et à travers l'éclipse (ctrl+décalage+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;
}
La source
Translate

Un simple tokenizer 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 pouvez donc utiliser 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 cela ne vous dérange pas) speed hit), il suffit de l'abstraire pour qu'il puisse être utilisé n'importe où.

La source
Translate

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

StringTokenizer

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

Modèle

La source
Translate

Si la langue est très simple comme juste

VERBE NOM

puis le fractionnement à la main fonctionne bien.

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

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

La source
Translate

JCommandersemble assez bon, même si je ne l'ai pas encore testé.

La source
Translate

Si votre texte contient des délimiteurs, vous pouvezsplitméthode.
Si le texte contient des chaînes irrégulières signifie un format différent, vous devez utiliserregular expressions.

La source
Translate

split méthode peut diviser une chaîne en un tableau de l'expression de sous-chaîne spécifiéeregex. Ses arguments sous deux formes, à savoir: split (String regex) et fractionné (String regex, int limit), qui a divisé (String regex) est en fait en appelant split (String regex, int limit) pour atteindre,la limite est 0. Puis, quand lelimite> 0etlimite <0représente quoi?

Quand lejdkexpliqué: quandlimite> 0les longueurs de sous-tableau jusqu'à la limite, c'est-à-dire, si possible, peuvent êtrelimite-1sous-division, restant comme sous-chaîne (sauf par limite-1 fois le caractère a une fin de chaîne)

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

limite = 0fin de la chaîne La chaîne vide sera tronquée.StringTokenizerclass 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

La source