Ποιες είναι οι διαφορετικές μέθοδοι για να αναλύσει χορδές σε Java;

ψήφοι
43

Για την ανάλυση εντολές παίκτης, έχω χρησιμοποιήσει τις περισσότερες φορές τη διάσπαση μέθοδος για να χωρίσει μια σειρά από διαχωριστικά και στη συνέχεια στη συνέχεια, μόλις καταλάβω τα υπόλοιπα από μια σειρά ifs ή switches. Ποιες είναι οι διαφορετικοί τρόποι ανάλυσης χορδές σε Java;

Δημοσιεύθηκε 06/08/2008 στις 00:49
πηγή χρήστη
Σε άλλες γλώσσες...                            


15 απαντήσεις

ψήφοι
19

Μου αρέσει πολύ κανονικές εκφράσεις. Εφ 'όσον οι χορδές εντολή είναι αρκετά απλή, μπορείτε να γράψετε μερικές regexes που θα μπορούσε να πάρει μερικές σελίδες του κώδικα για να αναλύσει το χέρι.

Θα ήθελα να προτείνω να ελέγξετε έξω http://www.regular-expressions.info για μια καλή εισαγωγή για να regexes, καθώς και συγκεκριμένα παραδείγματα για Java.

Απαντήθηκε 06/08/2008 στις 00:54
πηγή χρήστη

ψήφοι
14

Υποθέτω ότι προσπαθείτε να κάνετε το περιβάλλον εντολή ως επιεικής δυνατόν. Αν αυτή είναι η περίπτωση, σας προτείνω να χρησιμοποιήσετε έναν αλγόριθμο παρόμοιο με αυτό:

  1. Διαβάστε στο κορδόνι
    • Χωρίστε το string σε μάρκες
    • Χρησιμοποιήστε ένα λεξικό για να μετατρέψετε τα συνώνυμα σε μια κοινή μορφή
    • Για παράδειγμα, μετατροπή «χτύπησε», «γροθιά», «απεργία», και «κλωτσιά» όλα για να «χτυπήσει»
    • Εκτελέστε ενέργειες σε ένα μη διατεταγμένο, χωρίς αποκλεισμούς βάση
    • Μη αριθμημένη - «γροθιά τον πίθηκο στο πρόσωπο» είναι το ίδιο πράγμα όπως «το πρόσωπο στο γροθιά μαϊμού»
    • Inclusive - Εάν η εντολή είναι υποτίθεται ότι είναι «γροθιά τον πίθηκο στο πρόσωπο» και παρέχουν «μαϊμού γροθιά», θα πρέπει να ελέγξετε πόσες εντολές αυτή ταιριάζει. Εάν μόνο μία εντολή, να κάνει αυτή την ενέργεια. Θα μπορούσε ακόμη και να είναι μια καλή ιδέα να έχουμε προτεραιότητες εντολή, ακόμη και αν υπήρχαν ακόμη αγώνες, θα εκτελέσει την κορυφή δράση.
Απαντήθηκε 06/08/2008 στις 01:42
πηγή χρήστη

ψήφοι
13

Την ανάλυση με το χέρι είναι πολύ διασκεδαστικό ... στην αρχή :)

Στην πράξη, αν οι εντολές δεν είναι πολύ εξελιγμένα, μπορείτε να τους αντιμετωπίσουμε με τον ίδιο τρόπο όπως αυτά που χρησιμοποιούνται σε διερμηνείς γραμμή εντολών. Υπάρχει μια λίστα με τις βιβλιοθήκες που μπορείτε να χρησιμοποιήσετε: http://java-source.net/open-source/command-line . Νομίζω ότι μπορείτε να ξεκινήσετε με κοινά apache CLI ή args4j (χρησιμοποιεί σχολιασμούς). Είναι καλά τεκμηριωμένο και πολύ απλό στη χρήση. Που χειρίζονται την ανάλυση αυτόματα και το μόνο πράγμα που χρειάζεται να κάνετε είναι να διαβάσετε συγκεκριμένους τομείς σε ένα αντικείμενο.

Αν έχετε πιο εξελιγμένα εντολές, τότε ίσως η δημιουργία μιας επίσημης γραμματικής θα είναι μια καλύτερη ιδέα. Υπάρχει μια πολύ καλή βιβλιοθήκη με γραφικό επεξεργαστή, εντοπισμού σφαλμάτων και διερμηνέας για γραμματικές. Αυτό λέγεται ANTLR (και ο συντάκτης ANTLRWorks ) και είναι δωρεάν :) Υπάρχουν επίσης ορισμένα παράδειγμα γραμματικές και tutorials.

Απαντήθηκε 30/08/2008 στις 23:26
πηγή χρήστη

ψήφοι
7

Θα εξετάσουμε Java μεταναστεύσεις των Zork , και κλίνει προς την κατεύθυνση μιας απλής φυσικής γλώσσας Επεξεργαστής (οδηγείται είτε από tokenizing ή regex), όπως οι εξής (από αυτόν τον σύνδεσμο):

    δημόσια στατική boolean simpleNLP (String inputline, String λέξεις-κλειδιά [])
    {
        int i?
        int maxToken = keywords.length?
        int προς, από?
        εάν (inputline.length () = inputline.length ()) return false? // έλεγχος για κενό και κενές γραμμές
        ενώ (σε> = 0)
        {
            να = inputline.indexOf (»», από)?
            εάν (έως> 0) {
                lexed.addElement (inputline.substring (από, προς))?
                από = έως?
                ενώ (inputline.charAt (από) == ''
                && από = keywords.length) {κατάσταση = true? Διακοπή;}
            }
        }
        καθεστώς επιστρέψει?
    }

...

Οτιδήποτε που δίνει ένας προγραμματιστής ένα λόγο για να δούμε Zork και πάλι είναι καλό στο βιβλίο μου, απλά προσέξτε για Grues.

...

Απαντήθηκε 06/08/2008 στις 01:16
πηγή χρήστη

ψήφοι
6

Μια άλλη ψηφοφορία για ANTLR / ANTLRWorks. Αν δημιουργήσετε δύο εκδόσεις του αρχείου, ένα με τον κώδικα της Java για την πραγματική εκτέλεση των εντολών, και ένα χωρίς (μόνο με την γραμματική), τότε έχετε ένα εκτελέσιμο προδιαγραφές της γλώσσας, η οποία είναι μεγάλη για τη δοκιμή, ένα όφελος για την τεκμηρίωση , και ένα μεγάλο γλιτώνουν χρόνο, αν ποτέ αποφασίσει να το λιμάνι αυτό.

Απαντήθηκε 31/08/2008 στις 02:38
πηγή χρήστη

ψήφοι
6

η ίδια Sun συνιστά να μείνετε μακριά από StringTokenizer και χρησιμοποιώντας τη μέθοδο String.spilt αντ 'αυτού.

Θα ήθελα επίσης να εξετάσουμε την κατηγορία μοτίβο.

Απαντήθηκε 06/08/2008 στις 17:14
πηγή χρήστη

ψήφοι
4

Δοκιμάστε JavaCC μια γεννήτρια parser για Java.

Έχει πολλά χαρακτηριστικά για την ερμηνεία γλώσσες, και είναι καλά υποστηρίζεται σε Eclipse.

Απαντήθηκε 31/08/2008 στις 20:45
πηγή χρήστη

ψήφοι
4

Εάν αυτό είναι να αναλύσει τις γραμμές εντολών θα ήθελα να προτείνω τη χρήση Commons Cli .

Η βιβλιοθήκη Apache Commons CLI παρέχει ένα API για την επεξεργασία των διασυνδέσεων της γραμμής εντολών.

Απαντήθηκε 31/08/2008 στις 02:05
πηγή χρήστη

ψήφοι
2

@CodingTheWheel Heres κωδικό σας, λίγο καθαρισμό και μέσω της έκλειψης ( ctrl+ shift+ f) και η εισαχθεί ξανά εδώ :)

Συμπεριλαμβανομένων των τεσσάρων χώρων μπροστά κάθε γραμμή.

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;
}
Απαντήθηκε 06/08/2008 στις 16:18
πηγή χρήστη

ψήφοι
1

Διαίρεση μέθοδος μπορεί να χωρίσει μια σειρά σε μια σειρά της καθορισμένης έκφρασης substring regex. Τα επιχειρήματά της σε δύο μορφές, δηλαδή: διάσπαση ( String regex) και διαχωρισμού ( String regex, int limit), η οποία χωρίζεται ( String regex) είναι στην πραγματικότητα καλώντας διάσπαση (String regex, όριο int) για την επίτευξη, το όριο είναι 0 . Στη συνέχεια, όταν το όριο> 0 και το όριο <0 αντιπροσωπεύει αυτό;

Όταν το JDK εξήγησε: όταν όριο> 0 υπο-συστοιχία μήκη μέχρι να περιορίσει, ότι είναι, αν είναι δυνατόν, μπορεί να είναι το όριο-1 υπο-διαίρεση, παραμένουσα ως δευτερεύουσα συμβολοσειρά (εκτός από το όριο-1 φορές ο χαρακτήρας έχει συμβολοσειρά χωρίσει τέλος) ?

όριο <0 δεικνύει ότι δεν υπάρχει όριο στο μήκος του πίνακα?

όριο = 0 τέλος της συμβολοσειράς κενή συμβολοσειρά θα περικοπεί. StringTokenizerκατηγορία είναι για λόγους συμβατότητας και σώζεται κληρονομιά τάξη, γι 'αυτό θα πρέπει να προσπαθήσει να χρησιμοποιήσει τη μέθοδο διαχωρισμού της τάξης String. αναφέρονται σε σύνδεση

Απαντήθηκε 13/05/2014 στις 15:13
πηγή χρήστη

ψήφοι
1

Αν το κείμενο σας περιέχει κάποια διαχωριστικά, στη συνέχεια, μπορείτε να σας splitμέθοδο.
Αν το κείμενο περιέχει ακανόνιστες σειρές σημαίνει διαφορετική μορφή σε αυτό τότε θα πρέπει να χρησιμοποιήσετε regular expressions.

Απαντήθηκε 24/11/2012 στις 10:17
πηγή χρήστη

ψήφοι
1

JCommander φαίνεται αρκετά καλό, αν και έχω ακόμα να το δοκιμάσετε.

Απαντήθηκε 20/08/2010 στις 14:59
πηγή χρήστη

ψήφοι
1

Αν η γλώσσα είναι νεκρός απλό, όπως ακριβώς

ΡΗΜΑ ΟΥΣΙΑΣΤΙΚΟ

Στη συνέχεια διαχωρισμό με το χέρι λειτουργεί καλά.

Αν είναι πιο περίπλοκη, θα πρέπει πραγματικά να εξετάσουμε ένα εργαλείο όπως το ANTLR ή JavaCC.

Έχω ένα σεμινάριο για ANTLR (v2) σε http://javadude.com/articles/antlrtut που θα σας δώσει μια ιδέα για το πώς λειτουργεί.

Απαντήθηκε 16/09/2008 στις 16:35
πηγή χρήστη

ψήφοι
1

Όταν το String διαχωρισμού για την εντολή είναι allways το ίδιο String ή char (όπως το «?») Y συνιστούμε να χρησιμοποιήσετε την κλάση StrinkTokenizer:

StringTokenizer

αλλά όταν ο διαχωριστής ποικίλλει ή είναι πολύπλοκο y Recomend μπορείτε να χρησιμοποιήσετε τις τακτικές expresions, διασκορπισμένες μπορούν να χρησιμοποιηθούν από την ίδια την String τάξη, μέθοδος διάσπαση, δεδομένου ότι 1.4. Χρησιμοποιεί την κλάση Pattern από το πακέτο java.util.regex

Πρότυπο

Απαντήθηκε 06/08/2008 στις 16:40
πηγή χρήστη

ψήφοι
1

Μια απλή tokenizer εγχόρδων σε χώρους θα πρέπει να εργαστεί, αλλά στην πραγματικότητα υπάρχουν πολλοί τρόποι που μπορείτε να το κάνετε αυτό.

Εδώ είναι ένα παράδειγμα χρησιμοποιώντας ένα 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);
}

Στη συνέχεια, κουπόνια μπορούν να χρησιμοποιηθούν περαιτέρω για τα επιχειρήματα. Όλα υποθέτει δεν χώρων που χρησιμοποιούνται στα επιχειρήματα ... οπότε ίσως να θέλετε να κυλήσει το δικό σας απλό μηχανισμό ανάλυσης (όπως να πάρει το πρώτο κενό και χρησιμοποιώντας κείμενο πριν η δράση, ή χρησιμοποιώντας μια κανονική έκφραση, αν δεν σας πειράζει η ταχύτητα χτύπημα), απλά αφηρημένα έξω έτσι ώστε να μπορεί να χρησιμοποιηθεί οπουδήποτε.

Απαντήθηκε 06/08/2008 στις 00:57
πηγή χρήστη

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