Hva er de forskjellige metoder for å analysere strenger i Java?

stemmer
43

For parsing spiller kommandoer, har jeg oftest brukt split metoden for å dele en streng ved skilletegn og deretter til da bare finne ut resten av en rekke ifs eller switches. Hva er noen forskjellige måter å parsing strenger i Java?

Publisert på 05/08/2008 klokken 23:49
kilden bruker
På andre språk...                            


15 svar

stemmer
19

Jeg liker regulære uttrykk. Så lenge kommandostrenger er ganske enkelt, kan du skrive noen regexes som kunne ta et par sider med kode for å analysere manuelt.

Jeg foreslår at du sjekker ut http://www.regular-expressions.info for en god intro til regexes, samt konkrete eksempler for Java.

Svarte 05/08/2008 kl. 23:54
kilden bruker

stemmer
14

Jeg antar at du prøver å gjøre kommandogrensesnittet så tilgivende som mulig. Hvis dette er tilfelle, foreslår jeg at du bruker en algoritme som ligner på dette:

  1. Les i strengen
    • Splitte strengen inn symboler
    • Bruk en ordbok for å konvertere synonymer til en vanlig form
    • For eksempel, konvertere "hit", "punch", "strike", og "kick" alle til å "treffe"
    • Utføre handlinger på en uordnet, inkluderende basen
    • Usortert - "punch apekatten i ansiktet" er det samme som "ansiktet i ape punch"
    • Inkluderende - Hvis kommandoen er ment å være "punch apekatten i ansiktet" og de leverer "trøkk apekatt", bør du sjekke hvor mange kommandoer dette passer. Hvis bare én kommando, gjøre denne handlingen. Det kan også være en god idé å ha kommando prioriteringer, og selv om det ble til og med fyrstikker, ville det utføre toppen handlingen.
Svarte 06/08/2008 kl. 00:42
kilden bruker

stemmer
13

Parsing manuelt er mye moro ... i begynnelsen :)

I praksis hvis bud er ikke veldig sofistikert kan du behandle dem på samme måte som de som brukes i kommandolinje tolker. Det er en liste over biblioteker som du kan bruke: http://java-source.net/open-source/command-line . Jeg tror du kan starte med apache commons CLI eller args4j (bruker merknader). De er godt dokumentert og veldig enkel i bruk. De håndterer parsing automatisk og det eneste du trenger å gjøre er å lese bestemte felt i et objekt.

Hvis du har mer avanserte kommandoer, da ville kanskje skape en formell grammatikk være en bedre idé. Det er en veldig god bibliotek med grafisk editor, debugger og tolk for grammatikker. Det kalles ANTLR (og redaktøren ANTLRWorks ) og det er gratis :) Det er også noen eksempler grammatikker og tutorials.

Svarte 30/08/2008 kl. 22:26
kilden bruker

stemmer
7

Jeg ville se på Java vandringer av Zork , og lener seg mot en enkel Natural Language Prosessor (drevet enten ved tokenizing eller regex) som følgende (fra denne linken):

    public static boolean simpleNLP (String inputline, String søkeord [])
    {
        int i;
        int maxToken = keywords.length;
        int til, fra;
        if (inputline.length () = inputline.length ()) return false; // sjekk for tomme og tomme linjer
        while (i> = 0)
        {
            til = inputline.indexOf ('', fra);
            if (i> 0) {
                lexed.addElement (inputline.substring (fra, til));
                fra = å;
                while (inputline.charAt (fra) == ''
                && fra = keywords.length) {status = true; gå i stykker;}
            }
        }
        tilbake status;
    }

...

Noe som gir en programmerer en grunn til å se på Zork igjen er bra i min bok, bare se opp for Grues.

...

Svarte 06/08/2008 kl. 00:16
kilden bruker

stemmer
6

En annen stemme for ANTLR / ANTLRWorks. Hvis du oppretter to versjoner av filen, en med Java-kode for faktisk utfører kommandoene, og en uten (med bare grammatikk), da har du en kjørbar spesifikasjon av språket, som er flott for testing, en velsignelse for dokumentasjon og en stor tidsbesparer hvis du noen gang bestemmer deg for å porte det.

Svarte 31/08/2008 kl. 01:38
kilden bruker

stemmer
6

Solen selv anbefaler å holde seg unna StringTokenizer og bruke String.spilt metoden i stedet.

Du vil også være lurt å se på mønsteret klassen.

Svarte 06/08/2008 kl. 16:14
kilden bruker

stemmer
4

Prøv JavaCC en parser generator for Java.

Den har en rekke funksjoner for å tolke språk, og det er godt støttet på Eclipse.

Svarte 31/08/2008 kl. 19:45
kilden bruker

stemmer
4

Hvis dette er å analysere kommandolinjer jeg vil foreslå å bruke Commons CLI .

Apache Commons CLI-biblioteket gir et API for å behandle kommandogrensesnitt.

Svarte 31/08/2008 kl. 01:05
kilden bruker

stemmer
2

@CodingTheWheel Heres koden din, rydde litt opp og gjennom formørkelse ( ctrl+ shift+ f) og satt tilbake hit :)

Inkludert de fire mellomrom foran hver linje.

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;
}
Svarte 06/08/2008 kl. 15:18
kilden bruker

stemmer
1

split metode kan dele en streng inn i en matrise av den angitte treng uttrykk regex. Argumentene i to former, nemlig: split ( String regex) og splitt ( String regex, int limit), som splitter ( String regex) er faktisk ved å ringe split (String regex, int grense) for å oppnå, grense er 0 . Deretter, når den grense> 0 og begrense <0 representerer hva?

Når jdk forklart: når grense> 0 deloppstilling lengder opp til grensen, det vil si, hvis det er mulig, kan være grense-en inndeling, som blir igjen som en delstreng (unntatt ved grense-1 ganger tegn har strengen splittet ende) ;

grense <0 betyr ingen begrensning på lengden av rekken;

grense = 0 enden av strengen tomme strengen vil bli avkortet. StringTokenizerklasse er for kompatibilitet grunner, og er bevart arven klasse, så vi bør prøve å bruke split metoden i String-klassen. se lenker

Svarte 13/05/2014 kl. 14:13
kilden bruker

stemmer
1

Hvis teksten inneholder noen skilletegn så kan din splitmetode.
Hvis teksten inneholder uregelmessige strenger betyr forskjellig format i det så må du bruke regular expressions.

Svarte 24/11/2012 kl. 09:17
kilden bruker

stemmer
1

JCommander virker ganske bra, selv om jeg har ennå til å teste den.

Svarte 20/08/2010 kl. 13:59
kilden bruker

stemmer
1

Hvis språket er død enkelt som bare

VERB SUBSTANTIV

deretter splitting for hånd fungerer godt.

Hvis det er mer komplisert, bør du virkelig se inn et verktøy som ANTLR eller JavaCC.

Jeg har en tutorial på ANTLR (v2) på http://javadude.com/articles/antlrtut som vil gi deg en idé om hvordan det fungerer.

Svarte 16/09/2008 kl. 15:35
kilden bruker

stemmer
1

Når separator String for kommandoen er alltid den samme String eller røye (som ";") y tilrå du bruker StrinkTokenizer klasse:

StringTokenizer

men når separatoren varierer eller er sammensatt y tilrå å bruke den vanlige expresions, wich kan brukes av String klassen selv, metode splittet, siden 1,4. Den bruker Pattern klasse fra java.util.regex pakken

Mønster

Svarte 06/08/2008 kl. 15:40
kilden bruker

stemmer
1

En enkel streng tokenizer på områder skal fungere, men det er veldig mange måter du kan gjøre dette.

Her er et eksempel med en 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);
}

Da symboler kan videre brukes for argumentene. Alt dette forutsetter ingen mellomrom brukes i argumentene ... så kan det være lurt å rulle din egen enkel parsing mekanismen (som å få den første mellomrom og bruker teksten før som handlingen, eller ved hjelp av et vanlig uttrykk hvis du ikke bryr deg om speed hit), bare abstrakt den ut slik at den kan brukes overalt.

Svarte 05/08/2008 kl. 23:57
kilden bruker

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