Vă mulțumim pentru susținere

Care sunt diferitele metode de analiză a șirurilor de caractere din Java?

Pentru parsarea comenzilor player-ului, am folosit cel mai adesea versiunea split pentru a împărți un șir de delimitatori și apoi pentru a descoperi apoi restul printr-o serie de dacă s sau switch < code> es. Care sunt câteva moduri diferite de a parsa șiruri de caractere în Java?

0
adăugat editat
Am încercat să editez întrebarea pentru ao schimba de la a fi bazată pe opinie, dar mă tem că răspunsurile sunt deja prea convingătoare.
adăugat autor agweber

14 răspunsuri

Un simplu tokenizor de șir pe spații ar trebui să funcționeze, dar există foarte multe moduri în care puteți face acest lucru.

Iată un exemplu folosind un tokenizor:

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

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

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

Apoi, jetoanele pot fi folosite în continuare pentru argumente. Acest lucru presupune că nu există spații care să fie utilizate în argumente ... deci ar fi bine să vă rotiți propriul mecanism simplu de parsare (cum ar fi obținerea primului spațiu alb și folosirea unui text înainte ca acțiune sau folosind o expresie regulată dacă nu vă deranjează lovit de viteză), abuzați-l astfel încât să poată fi folosit oriunde.

0
adăugat
Din câte îmi amintesc, "StringTokenizer" este depreciat și este foarte recomandat să nu-l folosească de JDK docs.
adăugat autor Ali Motevallian

Presupun că încerci să faci interfața de comandă cât mai irositoare posibil. Dacă este cazul, vă recomand să utilizați un algoritm similar cu acesta:

  1. Read in the string
    • Split the string into tokens
    • Use a dictionary to convert synonyms to a common form
    • For example, convert "hit", "punch", "strike", and "kick" all to "hit"
    • Perform actions on an unordered, inclusive base
    • Unordered - "punch the monkey in the face" is the same thing as "the face in the monkey punch"
    • Inclusive - If the command is supposed to be "punch the monkey in the face" and they supply "punch monkey", you should check how many commands this matches. If only one command, do this action. It might even be a good idea to have command priorities, and even if there were even matches, it would perform the top action.
0
adăugat

Chiar îmi plac expresiile regulate. Atâta timp cât șirurile de comandă sunt destul de simple, puteți scrie câteva regexuri care ar putea necesita câteva pagini de cod pentru a analiza manual.

Vă sugerăm să verificați http://www.regular-expressions.info pentru o introducere bună la regexuri , precum și exemple specifice pentru Java.

0
adăugat
Mi-ar plăcea să accept acest lucru ca răspuns, dacă s-ar da un exemplu de cod pentru a ajuta noii buni.
adăugat autor agweber
@Gaurav Vashishta, expresiile regulate pot fi utile pentru lexing , dar acesta este doar primul pas în parsarea .
adăugat autor Mike Samuel

@CodingTheWheel Creste codul, un pic curat si prin eclipsa ( ctrl + shift + f ) si inserat inapoi aici :)

Inclusiv cele patru spații din fața fiecărei linii.

public static boolean simpleNLP(String inputline, String keywords[]) {
    if (inputline.length() < 1)
        return false;

    List lexed = new ArrayList(); 
    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;
}
0
adăugat

Atunci când separatorul String pentru comanda este întotdeauna același String sau char (ca ";") y recomendă folosiți clasa StrinkTokenizer:

StringTokenizer

dar când separatorul variază sau este complex, vă recomandăm să utilizați expresii regulate, care pot fi folosite de clasa String în sine, metoda divizată, deoarece 1.4. Utilizează clasa Pattern din pachetul java.util.regex

Model

0
adăugat

Sun-ul însuși vă recomandă să rămâneți departe de StringTokenizer și să utilizați metoda String.spilt.

Veți dori, de asemenea, să vă uitați la clasa Pattern.

0
adăugat

Dacă textul conține anumite delimitatoare, atunci puteți să vă împărțiți metoda split Dacă textul conține șiruri neregulate înseamnă format diferit în el, atunci trebuie să utilizați expresii regulate .

0
adăugat

Dacă limbajul este mort ca simplu

VERB NOUN

apoi împărțirea cu mâna funcționează bine.

Dacă este mai complexă, ar trebui să căutați într-adevăr un instrument precum ANTLR sau JavaCC.

Am un tutorial pe ANTLR (v2) la http://javadude.com/articles/antlrtut care vă va oferi o idee despre cum funcționează.

0
adăugat

Un alt vot pentru ANTLR / ANTLRWorks. Dacă creați două versiuni ale fișierului, unul cu codul Java pentru executarea efectivă a comenzilor și unul fără (cu doar gramatică), atunci aveți o specificație executabilă a limbii, care este excelentă pentru testare, un avantaj pentru documentație , și un timp mare dacă decideți vreodată să-l portați.

0
adăugat

Încercați JavaCC un generator parser pentru Java.

Are multe caracteristici pentru interpretarea limbilor și este bine susținută de Eclipse.

0
adăugat

Parsarea manuală este o mulțime de distracție ... la început :)

În practică, dacă comenzile nu sunt foarte sofisticate, le poți trata în același mod ca și cele utilizate în interpreții de linie de comandă. Există o listă de biblioteci pe care le puteți utiliza: http://java-source.net/open sursa buna / linie de comandă . Cred că puteți începe cu Apache commons CLI sau args4j (utilizează adnotări). Ele sunt bine documentate și foarte simple în uz. Ei gestionează parsarea în mod automat și singurul lucru pe care trebuie să-l faceți este să citiți anumite câmpuri dintr-un obiect.

Dacă aveți comenzi mai sofisticate, atunci ar putea crea o gramatică formală o idee mai bună. Există o foarte bună bibliotecă cu editor grafic, depanator și interpret pentru gramatică. Se numește ANTLR (și editorul ANTLRWorks ) și este gratuit :) Există și câteva exemple de gramatică și tutoriale.

0
adăugat

Dacă acest lucru este de a analiza liniile de comandă, aș sugera folosirea Commons Cli .

Biblioteca CLI Apache Commons oferă un API pentru procesarea interfețelor liniei de comandă.

0
adăugat

JCommander seems quite good, although I have yet to test it.

0
adăugat

split method can split a string into an array of the specified substring expression regex. Its arguments in two forms, namely: split (String regex) and split (String regex, int limit), which split (String regex) is actually by calling split (String regex, int limit) to achieve, limit is 0. Then, when the limit> 0 and limit <0 represents what?

When the jdk explained: when limit> 0 sub-array lengths up to limit, that is, if possible, can be limit-1 sub-division, remaining as a substring (except by limit-1 times the character has string split end);

limit <0 indicates no limit on the length of the array;

limit = 0 end of the string empty string will be truncated. StringTokenizer class is for compatibility reasons and is preserved legacy class, so we should try to use the split method of the String class. refer to link

0
adăugat