Jaké jsou různé metody k analýze řetězce v Javě?

hlasů
43

Pro analýzu příkazy hráče jsem nejčastěji používal rozdělený metodu rozdělit řetězec od oddělovače a potom se pak už jen přijít na to, zbytek série ifs nebo switches. Jaké jsou různé způsoby parsování řetězce v Javě?

Položena 06/08/2008 v 00:49
zdroj uživatelem
V jiných jazycích...                            


15 odpovědí

hlasů
19

Moc se mi líbí regulárních výrazů. Dokud řetězce příkazů jsou poměrně jednoduché, můžete napsat pár regexes, že může trvat několik stránek kódu ručně rozebrat.

Navrhoval bych si vyzkoušet http://www.regular-expressions.info pro dobrý úvod do regexes, stejně jako konkrétní příklady pro Javu.

Odpovězeno 06/08/2008 v 00:54
zdroj uživatelem

hlasů
14

Předpokládám, že se snažíte, aby se příkaz interface, jak odpouštět, jak je to možné. Je-li tomu tak, doporučuji použít algoritmus podobný tomuto:

  1. Přečíst v řetězci
    • Rozdělit řetězec do tokenů
    • Používat slovník převést synonyma ke společnému formuláře
    • Například převést „hit“, „úder“, „úder“ a „kop“ všechno na „hit“
    • Provádět akce na neuspořádané, včetně základny
    • Neuspořádané - „úder opici tváří v tvář“ je totéž jako „tvář v opičím punč“
    • Inclusive - Pokud je příkaz má být „punč opice tváří v tvář“ a dodávají „punch opice“, měli byste si zjistit, kolik příkazy toto utkání. Jestliže jediný příkaz provést tuto akci. Mohlo by to být dobrý nápad mít velení priority, a to i v případě, že byli dokonce zápasů, bylo by to provést horní akci.
Odpovězeno 06/08/2008 v 01:42
zdroj uživatelem

hlasů
13

Parsování ručně je hodně legrace ... na začátku :)

V praxi, pokud příkazy nejsou příliš sofistikovaná, můžete s nimi zacházet stejně jako ty používané v příkazového řádku tlumočníků. K dispozici je seznam knihoven, které můžete použít: http://java-source.net/open-source/command-line . Myslím, že můžete začít s Apache Commons CLI nebo args4j (používá anotace). Jsou dobře zdokumentovány a skutečně jednoduchý na používání. Oni rukojeť analýze automaticky a jediná věc, kterou musíte udělat, je přečíst konkrétní pole v objektu.

Pokud máte sofistikovanější příkazy, pak možná vytvářet formální gramatiku by bylo lepší nápad. Je zde velmi dobrá knihovna s grafickým editorem, debugger a tlumočnice pro gramatiky. Říká se tomu ANTLR (a editor ANTLRWorks ) a je to zdarma :) Existuje také několik příkladů gramatiky a cvičení.

Odpovězeno 30/08/2008 v 23:26
zdroj uživatelem

hlasů
7

To bych se na Java migrací z Zork a přiklánět k jednoduchým přirozeného jazyka procesoru (poháněný buď tokenizaci nebo regulární výraz), jako je například následující (z tohoto odkazu):

    public static boolean simpleNLP (String inputline, String klíčová slova [])
    {
        int i;
        int maxToken = keywords.length;
        int, z;
        if (inputline.length () = inputline.length ()) return false; // zkontrolovat prázdné a prázdné řádky
        zatímco (k> = 0)
        {
            k = inputline.indexOf (‘‘, z);
            if (k> 0) {
                lexed.addElement (inputline.substring (od, do));
                z = k;
                while (inputline.charAt (z) == ''
                && z = keywords.length) {status = true; přestávka;}
            }
        }
        vrátí stav;
    }

...

Vše, co dává programátor důvod podívat se na Zork opět je dobré v mé knize, jen pozor na Grues.

...

Odpovězeno 06/08/2008 v 01:16
zdroj uživatelem

hlasů
6

Další hlas pro ANTLR / ANTLRWorks. Máte-li vytvořit dvě verze souboru, jeden s kódem Javy pro skutečně provádění příkazů, a bez ní (jen s gramatikou), pak máte spustitelný specifikaci jazyka, což je skvělé pro testování, požehnáním pro dokumentaci a velkou úsporu času, pokud jste někdy rozhodnete portovat.

Odpovězeno 31/08/2008 v 02:38
zdroj uživatelem

hlasů
6

Sun sám doporučuje pobývá od StringTokenizer a místo toho pomocí metody String.spilt.

Budete také chtít, aby se podívat na třídě vzor.

Odpovězeno 06/08/2008 v 17:14
zdroj uživatelem

hlasů
4

Zkuste JavaCC parser generátor pro Javu.

To má mnoho funkcí pro tlumočení jazyků, a to je dobře podporován na platformě Eclipse.

Odpovězeno 31/08/2008 v 20:45
zdroj uživatelem

hlasů
4

Pokud je to rozebrat příkazové řádky bych navrhnout pomocí Commons CLI .

Knihovna Apache Commons CLI poskytuje API pro zpracování rozhraní příkazové řádky.

Odpovězeno 31/08/2008 v 02:05
zdroj uživatelem

hlasů
2

@CodingTheWheel Heres váš kód, trochu uklidit a přes Slunce ( ctrl+ shift+ f) a vloží sem :)

Včetně čtyř prostorů před každý řádek.

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;
}
Odpovězeno 06/08/2008 v 16:18
zdroj uživatelem

hlasů
1

Split metoda může rozdělit řetězec do pole určeného dílčího řetězce výrazu regex. Jeho argumenty ve dvou formách, a to: split ( String regex) a split ( String regex, int limit), které štěpí ( String regex), je ve skutečnosti voláním split (String regex, limitní int), aby bylo dosaženo, limit je 0 . Pak, když hranice> 0 a omezení <0 znamená co?

Když jdk je vysvětleno: když hranice> 0 délky sub-pole až k omezení, to znamená, že pokud je to možné, může být limit-1 pododdělení, přičemž zůstává jako podretezec (s výjimkou omezení-1 krát má charakter řetězec rozdělen konec) ;

Limit <0 znamená, žádné omezení na délku pole;

limit = 0 konec řetězce prázdný řetězec bude zkrácen. StringTokenizertřída je z důvodů kompatibility a je zachována starší třídu, takže bychom se měli snažit používat dělenou metody třídy String. viz odkaz

Odpovězeno 13/05/2014 v 15:13
zdroj uživatelem

hlasů
1

Pokud váš text obsahuje některé oddělovače pak můžete svou splitmetodu.
Pokud text obsahuje nepravidelné řetězce znamená, že jiný formát v něm pak musíte použít regular expressions.

Odpovězeno 24/11/2012 v 10:17
zdroj uživatelem

hlasů
1

JCommander vypadá docela dobře, i když jsem ještě vyzkoušet.

Odpovězeno 20/08/2010 v 14:59
zdroj uživatelem

hlasů
1

Je-li jazyk je mrtvý jednoduché, jako je právě

VERB NOUN

Potom rozdělení rukou funguje dobře.

Pokud je to složitější, měli byste opravdu podívat do nástroje jako ANTLR nebo JavaCC.

Mám návod na ANTLR (v2) na http://javadude.com/articles/antlrtut který vám poskytne představu o tom, jak to funguje.

Odpovězeno 16/09/2008 v 16:35
zdroj uživatelem

hlasů
1

Když se separátor řetězec příkazu je vždy stejný String nebo char (jako „;“) y doporučuji použít třídu StrinkTokenizer:

StringTokenizer

ale když je separátor se mění nebo je komplex y doporučuji využít pravidelných expresions, Který může být použit provázku třídy samotné, způsob rozdělení, od 1.4. To používá třídu vzorek z obalu java.util.regex

Vzor

Odpovězeno 06/08/2008 v 16:40
zdroj uživatelem

hlasů
1

Jednoduchý řetězec tokenizer na prostranství by měly fungovat, ale tam jsou opravdu mnoho způsobů, jak byste mohli dosáhnout.

Zde je příklad použití 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);
}

Pak tokeny mohou být dále použity pro argumenty. To vše předpokládá, že žádné mezery jsou použity v argumentech ... takže možná budete chtít vytvořit vlastní jednoduché rozebrat mechanismus (jak se dostat do první mezery a použití textu, než jako akce, nebo pomocí regulárních výrazů, pokud nevadí rychlost hit), jen abstraktní na to, aby jej lze použít kdekoliv.

Odpovězeno 06/08/2008 v 00:57
zdroj uživatelem

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