Was sind die verschiedenen Methoden Strings in Java zu analysieren?

stimmen
43

Für das Parsen Spieler Befehle habe ich meistens die verwendete Split - Methode eine Zeichenfolge durch Trennzeichen zu spalten und dann , um dann herauszufinden , nur den Rest durch eine Reihe von ifs oder switches. Was sind einige verschiedene Arten von Strings in Java Parsen?

Veröffentlicht am 06/08/2008 um 00:49
quelle vom benutzer
In anderen Sprachen...                            


15 antworten

stimmen
19

Ich mag wirklich reguläre Ausdrücke. Solange die Befehlsfolgen ziemlich einfach sind, können Sie ein paar reguläre Ausdrücke schreiben, die ein paar Seiten von Code in Anspruch nehmen könnte manuell zu analysieren.

Ich würde vorschlagen , Sie überprüfen http://www.regular-expressions.info für eine gute Einführung in reguläre Ausdrücke, sowie spezifische Beispiele für Java.

Beantwortet am 06/08/2008 um 00:54
quelle vom benutzer

stimmen
14

Ich nehme an, Sie versuchen, die Befehlsschnittstelle so nachsichtig wie möglich zu machen. Wenn dies der Fall ist, empfehle ich Ihnen, einen Algorithmus ähnlich wie diese verwenden:

  1. in der Zeichenfolge lesen
    • Teilen Sie die Zeichenfolge in Token
    • Verwenden Sie ein Wörterbuch konvertieren, um Synonyme zu einer gemeinsamen Form
    • Zum Beispiel konvertiert "Hit", "Punch", "Strike" und "Kick" alles zu "Hit"
    • Führen Sie Aktionen auf einer ungeordneten, inklusive Basis
    • Ungeordnete - „den Affen in Schlag ins Gesicht“ ist das gleiche wie „das Gesicht in den Affen punch“
    • Inclusive - Wird der Befehl soll „Punch den Affen im Gesicht“ sein , und sie liefern „punch monkey“, sollten Sie überprüfen , wie viele Befehle dieser übereinstimmt. Wenn nur ein Befehl, tun diese Aktion. Es könnte sogar eine gute Idee, zu Befehl Prioritäten hat, und selbst wenn es wurde sogar übereinstimmt, würde es die Top-Aktion ausführen.
Beantwortet am 06/08/2008 um 01:42
quelle vom benutzer

stimmen
13

Parsen eine Menge Spaß wird manuell ... am Anfang :)

In der Praxis , wenn Befehle nicht sehr anspruchsvoll sind , können Sie sie auf die gleiche Weise wie die in Kommandozeilen - Interpreter verwendet behandeln. Es gibt eine Liste von Bibliotheken , die Sie verwenden können: http://java-source.net/open-source/command-line . Ich denke , mit denen Sie beginnen können Apache Commons CLI oder args4j (verwendet Anmerkungen). Sie sind gut dokumentiert und sehr einfach im Gebrauch. Sie behandeln das Parsen automatisch und das einzige , was Sie tun müssen , um bestimmte Felder in einem Objekt zu lesen.

Wenn Sie komplexere Befehle haben, dann vielleicht eine formale Grammatik zu schaffen wäre eine bessere Idee. Es gibt eine sehr gute Bibliothek mit grafischen Editor, Debugger und Dolmetscher für Grammatiken. Es heißt ANTLR (und den Editor ANTLRWorks ) und es ist kostenlos :) Es gibt auch einige Beispiel - Grammatiken und Tutorials.

Beantwortet am 30/08/2008 um 23:26
quelle vom benutzer

stimmen
7

Ich würde schauen Java - Migrationen von Zork und neige zu einer einfachen Natural Language Processor (angetrieben entweder durch Tokenisieren oder reguläre Ausdrücke), wie die folgenden (aus diesem Link):

    public static boolean simpleNLP (String Eingabezeile, String Schlüsselwörter [])
    {
        int i;
        int maxToken = keywords.length;
        int, aus;
        if (inputline.length () = inputline.length ()) return false; // für leere und leere Zeilen überprüfen
        während (bis> = 0)
        {
            to = inputline.indexOf (‘‘, aus);
            if (> 0) {
                lexed.addElement (inputline.substring (von, bis));
                = von zu;
                while (inputline.charAt (von) == ''
                && aus = keywords.length) {status = true; Unterbrechung;}
            }
        }
        Zustand zurückzukehren;
    }

...

Alles, was ein Programmierer einen Grund zu Zork wieder zu sehen gibt, ist gut in meinem Buch, schau nur mal eben Grues.

...

Beantwortet am 06/08/2008 um 01:16
quelle vom benutzer

stimmen
6

Eine weitere Stimme für ANTLR / ANTLRWorks. Wenn Sie zwei Versionen der Datei erstellen, eine mit dem Java-Code für tatsächlich die Befehle ausführen, und einen ohne (nur mit der Grammatik), dann haben Sie eine ausführbare Spezifikation der Sprache, die für die Prüfung groß ist, ein Segen für die Dokumentation und eine große Zeitersparnis, wenn Sie jemals in dem Hafen es entscheiden.

Beantwortet am 31/08/2008 um 02:38
quelle vom benutzer

stimmen
6

Sun selbst empfiehlt Bleiben von StringTokenizer entfernt und mit Hilfe der String.spilt Methode statt.

Sie werden auch in der Pattern-Klasse suchen.

Beantwortet am 06/08/2008 um 17:14
quelle vom benutzer

stimmen
4

Versuchen Sie JavaCC einen Parser - Generator für Java.

Es hat eine Menge Funktionen für die Interpretation Sprachen, und es ist gut auf Eclipse unterstützt.

Beantwortet am 31/08/2008 um 20:45
quelle vom benutzer

stimmen
4

Wenn diese Befehlszeilen zu analysieren ist , würde ich vorschlagen , mit Commons Cli .

Die Apache Commons CLI-Bibliothek stellt eine API für die Verarbeitung von Schnittstellen-Befehlszeile.

Beantwortet am 31/08/2008 um 02:05
quelle vom benutzer

stimmen
2

@CodingTheWheel Heres Code, Reinigen Sie ein bisschen nach oben und durch Eclipse ( ctrl+ shift+ f) und die Rückseite hier eingefügt :)

Einschließlich der vier Räume vor jeder Zeile.

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;
}
Beantwortet am 06/08/2008 um 16:18
quelle vom benutzer

stimmen
1

Spaltverfahren kann eine Zeichenkette in einem Array des angegebenen Teil Ausdruck aufgeteilt regex. Ihre Argumente in zwei Formen, nämlich: split ( String regex) und Split ( String regex, int limit), die geteilt ( String regex) ist eigentlich durch Split Aufruf (String regex, int limit) zu erreichen, ist Grenze 0 . Dann, wenn die Grenze> 0 und Grenze <0 bedeutet was?

Wenn die jdk erklärt: wenn Grenze> 0 Unterarray zu begrenzen Längen bis zu, ist , dass, wenn möglich, kann sein Limit-1 - Unterteilung, als Teilkette verbleibenden (außer durch Grenzwert-1 mal der Charakter hat Zeichenfolge aufgeteilt end) ;

Grenze <0 bedeutet keine Begrenzung für die Länge des Arrays;

limit = 0 Ende der Zeichenfolge leeren Zeichenfolge wird abgeschnitten. StringTokenizerKlasse ist aus Kompatibilitätsgründen und Legacy - Klasse erhalten, also sollten wir versuchen , die Split - Methode der String - Klasse zu verwenden. siehe Link

Beantwortet am 13/05/2014 um 15:13
quelle vom benutzer

stimmen
1

Wenn der Text einige Trennzeichen enthält , dann können Sie Ihre splitMethode.
Wenn der Text unregelmäßig Zeichenfolgen enthält , bedeutet anderes Format in es dann müssen Sie verwenden regular expressions.

Beantwortet am 24/11/2012 um 10:17
quelle vom benutzer

stimmen
1

JCommander scheint recht gut, obwohl ich noch nicht testen kann .

Beantwortet am 20/08/2010 um 14:59
quelle vom benutzer

stimmen
1

Wenn die Sprache ist tot einfach wie nur

VERB NOMEN

dann Spaltung von Hand funktioniert gut.

Wenn es komplizierter ist, sollten Sie wirklich ein Werkzeug wie ANTLR oder JavaCC suchen.

Ich habe ein Tutorial über ANTLR (v2) bei bekam http://javadude.com/articles/antlrtut , die Ihnen eine Vorstellung davon, wie es funktioniert.

Beantwortet am 16/09/2008 um 16:35
quelle vom benutzer

stimmen
1

Wenn der Trenn-String für den Befehl ist immer die gleiche Zeichenfolge oder char (wie die „;“) y recomend Sie StrinkTokenizer Klasse verwenden:

StringTokenizer

aber wenn der Abscheider variiert oder komplex y Recomend Sie den regulären Ausdrücken zu verwenden, weicht durch die String-Klasse selbst, Verfahren gespalten, da 1.4 verwendet werden. Es verwendet die Pattern-Klasse aus dem java.util.regex Paket

Muster

Beantwortet am 06/08/2008 um 16:40
quelle vom benutzer

stimmen
1

Eine einfache Zeichenfolge tokenizer auf Leerzeichen sollte funktionieren, aber es gibt wirklich viele Möglichkeiten, wie Sie dies tun könnte.

Hier ist ein Beispiel einer tokenizer mit:

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

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

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

Dann können Token weiter für die Argumente verwendet werden. Das alles übernimmt keine Leerzeichen sind in den Argumenten verwendet ... so möchten Sie vielleicht Ihren eigenen einfachen Parsing-Mechanismus rollen (wie das erste Leerzeichen bekommen und mit Text vor als Aktion oder einen regulären Ausdruck verwenden, wenn Sie das nicht stören Speed-Treffer), es ist nur abstrakt, so kann es überall eingesetzt werden.

Beantwortet am 06/08/2008 um 00:57
quelle vom benutzer

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