Java dizeleri ayrıştırmak farklı yöntemler nelerdir?

oy
43

Oyuncu komutları ayrıştırma için, ben en sık kullandığım bölünmüş sınırlayıcı tarafından bir dize bölmek için yöntem ve daha sonra sadece bir dizi dinlenme anlamaya ifs veya switches. Java dizeleri ayrıştırma bazı farklı yolları nelerdir?

Oluştur 06/08/2008 saat 00:49
kaynak kullanıcı
Diğer dillerde...                            


15 cevaplar

oy
19

Gerçekten normal ifadeler gibi. Sürece komut dizeleri oldukça basit olarak, el ile ayrıştırmak için birkaç kod sayfalarını sürebilir birkaç Regexes yazabilir.

Ben kontrol öneririm http://www.regular-expressions.info regexes için iyi bir tanıtımın yanı sıra Java için spesifik örnekler.

Cevap 06/08/2008 saat 00:54
kaynak kullanıcı

oy
14

Ben mümkün olduğunca komut arayüzü olarak bağışlayıcı yapmaya çalışıyoruz varsayalım. Bu durumda, ben buna benzer bir algoritma kullanıyoruz öneririz:

  1. dizesinde Oku
    • dizgeciklerine dize Bölünmüş
    • ortak bir forma eş anlamlılarını dönüştürmek için bir sözlük kullanın
    • Örneğin, "hit", "yumruk", "grev" ve "tekme" "hit" tüm dönüştürmek
    • Bir sırasız, kapsayıcı bazında eylemler gerçekleştirin
    • Sırasız - Aynı şey "maymun yumrukla yüzü" olduğu gibi "karşısında maymun yumruk"
    • Dahil - Komut olması gerekiyordu "Eğer karşısında maymun yumruk" ve onlar, bu maçları kaç komutları kontrol etmelisiniz "yumruk maymun" kaynağı. Sadece bir komutla, bu eylem yapmak. Hatta komut öncelikleri olması iyi bir fikir olabilir, hatta orada maçları bile, üst eylemi gerçekleştirmek istiyorum.
Cevap 06/08/2008 saat 01:42
kaynak kullanıcı

oy
13

başında eğlenceli ... bir çok elle edilir Ayrıştırma :)

Komutları çok sofistike değilse Uygulamada bunları komut satırı tercüman kullanılanlar gibi aynı şekilde davranabilirsiniz. : Kullanabileceğiniz kütüphanelerin bir listesi var http://java-source.net/open-source/command-line . Sana ile başlayabilirsiniz düşünüyorum apache commons CLI veya args4j (ek açıklamaları kullanır). Onlar iyi belgelenmiş ve kullanımda gerçekten basittir. Bunlar otomatik ayrıştırma tanıtıcı ve yapmanız gereken tek şey bir nesne özellikle alanları okumaktır.

Eğer daha sofistike komutlar varsa, o zaman belki resmi bir dilbilgisi oluşturarak daha iyi bir fikir olacaktır. Gramerler için grafik editörü, hata ayıklayıcı ve tercüman ile çok iyi bir kütüphane bulunmaktadır. Deniyor ANTLR (ve editör ANTLRWorks ) ve ücretsizdir :) bazı örnek dilbilgisi ve öğreticiler de vardır.

Cevap 30/08/2008 saat 23:26
kaynak kullanıcı

oy
7

Ben bakardım Java göçler arasında Zork ve basit meyledeceğini Doğal Dil İşlemci gibi (ya tokenizing veya regex ile tahrik) (bu bağlantıdan) Aşağıdaki:

    kamu statik boolean simpleNLP (Dize inputline, dize anahtar kelimeler [])
    {
        int i;
        int maxToken = keywords.length;
        , Için int;
        Eğer (inputline.length () = inputline.length ()) yanlış döndürür; // boş ve boş çizgiler olup olmadığına
        ise (> = 0)
        {
            = Inputline.indexOf ('' dan) için;
            Eğer {(> 0)
                lexed.addElement (() için, gelen inputline.substring);
                = Için;
                ise (inputline.charAt (==) geriye
                && = keywords.length) {durum = true; kırmak;}
            }
        }
        durumu döndürebilir;
    }

...

bir programcı Zork yine kitabımda iyidir bakmak için bir neden veren şey, sadece GRUES dikkat edin.

...

Cevap 06/08/2008 saat 01:16
kaynak kullanıcı

oy
6

ANTLR / ANTLRWorks için bir başka oy. İki Dosyanın sürümlerini aslında komut çalıştırmak için Java kodu ile birini ve (sadece dilbilgisi ile) olmaksızın bir tane oluşturun, o zaman, test için dokümantasyon için bir nimet harika dilin çalıştırılabilir bir şartname var ve büyük bir zaman kazandıran hiç portuna o karar verirseniz.

Cevap 31/08/2008 saat 02:38
kaynak kullanıcı

oy
6

Güneş kendisi StringTokenizer uzak durmak ve bunun yerine String.spilt yöntemi kullanılmasını önerir.

Ayrıca Desen sınıfına bakmak isteyeceksiniz.

Cevap 06/08/2008 saat 17:14
kaynak kullanıcı

oy
4

Deneyin JavaCC Java için bir ayrıştırıcı jeneratör.

Bu diller yorumlamak için özellikleri bir yeri vardır ve iyi Eclipse üzerinde desteklenen.

Cevap 31/08/2008 saat 20:45
kaynak kullanıcı

oy
4

Bu komut satırları ayrıştırmak için ise kullanıyorum öneririm Commons Cli .

Apache Commons CLI kütüphane komut satırı arayüzü işlenmesi için bir API sağlar.

Cevap 31/08/2008 saat 02:05
kaynak kullanıcı

oy
2

@CodingTheWheel İşte kodunuzu, biraz temizlemek ve tutulma yoluyla ( ctrl+ shift+ f) ve buraya yerleştirilen :)

Her bir satır önünde dört boşluk da dahil olmak üzere.

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;
}
Cevap 06/08/2008 saat 16:18
kaynak kullanıcı

oy
1

Bölünmüş bir yöntem belirtilen bir alt ifadesinin bir diziye bir dizi bölünmüş olabilir regex. Bu, yani iki formda, bağımsız değişkenlerin: bölünmüş ( String regex) ve bölme ( String regex, int limitbölünmüş), ( String regexaslında elde etmek için bölme (String düzenli ifade, int sınır) çağırarak) olup, limiti 0 . Sonra, ne zaman limiti> 0 ve sınır <0 ne gösterir?

Tüm JDK açıklanmıştır: zaman sınır> 0 alt-dizi sınırlama uzunluğuna kadar mümkünse, yani olabilir sınır-1 (karakter dizisi son split-1 sınır kez hariç), bir alt dizge kalan, alt bölme ;

sınırı <0 dizinin uzunluğu ile ilgili bir sınır belirler;

sınır = 0 dize boş dize sonu kesilecek. StringTokenizersınıf uyum sağlanabilmesi için gereklidir ve eski sınıf korunur, bu yüzden String sınıfının split yöntemi kullanmaya çalışmalısınız. bakınız bağlantı

Cevap 13/05/2014 saat 15:13
kaynak kullanıcı

oy
1

Metin sonra bazı sınırlayıcılar içeriyorsa size can splityöntemi.
Metin düzensiz dizeleri içeriyorsa o zaman kullanmalısınız farklı biçimi anlamına gelir regular expressions.

Cevap 24/11/2012 saat 10:17
kaynak kullanıcı

oy
1

JCommander ben bunu test etmek henüz olmasına rağmen, oldukça iyi görünüyor.

Cevap 20/08/2010 saat 14:59
kaynak kullanıcı

oy
1

dil gibi ölü basit ise

FİİL İSİM

Daha sonra elle bölme iyi çalışıyor.

daha karmaşık, gerçekten antlr veya JavaCC gibi bir aracı haline bakmak gerekir.

Ben antlr (sürüm 2) üzerinde bir öğretici var http://javadude.com/articles/antlrtut size nasıl çalıştığını hakkında bir fikir verecektir.

Cevap 16/09/2008 saat 16:35
kaynak kullanıcı

oy
1

komutu için ayırıcı dize aynı dize veya karakter daima olduğunda (gibi ";") y Eğer StrinkTokenizer sınıfını kullanmak tavsiye:

StringTokenizer

ayırıcı değişir ya da kompleks y salık normal expresions kullanmaktır ama ne zaman, hangi 1.4 beri String sınıfı kendisi, yöntem bölme tarafından kullanılabilir. Bu java.util.regex paketinden Desen sınıfını kullanır

Desen

Cevap 06/08/2008 saat 16:40
kaynak kullanıcı

oy
1

uzaylarda basit dize tokenizer çalışması gerekir, ancak bu yapabileceğini gerçekten birçok yolu vardır.

İşte dizgeciklerini kullanarak bir örnek:

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

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

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

Daha sonra simgeler daha bağımsız değişkenler için kullanılabilir. Bu, tüm ... boşluk argümanları kullanılan varsayar böylece ilk boşluk alma ve eylem olarak önce metni kullanarak ya da sakıncası yoksa normal bir ifade kullanmak gibi (kendi basit ayrıştırma mekanizması rulo isteyebilirsiniz hız isabet), dışarı sadece soyut yüzden her yerde kullanılabilir.

Cevap 06/08/2008 saat 00:57
kaynak kullanıcı

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