विभिन्न तरीकों जावा में तार पार्स करने के लिए क्या हैं?

वोट
43

खिलाड़ी आदेशों को पार्स के लिए, मैं सबसे अधिक बार उपयोग किया है विभाजन सीमांकक द्वारा एक स्ट्रिंग को विभाजित करने की विधि और उसके बाद तो बस की एक श्रृंखला से आराम यह पता लगाने की ifया switchतों। जावा में तार पार्स करने से कुछ अलग तरीके क्या हैं?

06/08/2008 को 00:49
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


15 जवाब

वोट
19

मैं वास्तव में नियमित अभिव्यक्ति की तरह। जब तक आदेश तार काफी सरल कर रहे हैं, तो आपको कुछ regexes कि कोड की कुछ पृष्ठों ले सकता है मैन्युअल रूप से पार्स करने के लिए लिख सकते हैं।

मैं तुम्हें बाहर की जाँच का सुझाव देते हैं http://www.regular-expressions.info regexes के लिए एक अच्छा परिचय के लिए, साथ ही जावा के लिए विशिष्ट उदाहरण।

06/08/2008 को 00:54
का स्रोत उपयोगकर्ता

वोट
14

मैं तुम्हें आदेश इंटरफेस के रूप में संभव के रूप में क्षमा करने की कोशिश कर रहे हैं मान। यदि यह मामला है, मैं सुझाव है कि आप एक एल्गोरिथ्म इस के समान का उपयोग करें:

  1. स्ट्रिंग में पढ़ें
    • टोकन में स्ट्रिंग विभाजित
    • एक शब्दकोश का उपयोग एक आम रूप को पर्यायवाची शब्द कन्वर्ट करने के लिए
    • उदाहरण के लिए, परिवर्तित "मारा", "पंच", "हड़ताल", और "किक" सभी "हिट" करने के लिए
    • एक अव्यवस्थित, समावेशी आधार पर कार्रवाई भी
    • अक्रमित - "चेहरे में बंदर पंच" एक ही बात के रूप में "बंदर पंच में चेहरा" है
    • समावेशी - आदेश माना जाता है, तो "चेहरे में बंदर पंच" और वे "पंच बंदर", तो आप इस कितने आदेशों से मेल खाता है की जाँच करनी चाहिए की आपूर्ति। केवल एक ही आदेश है, तो इस कार्रवाई करते हैं। यह भी आदेश प्राथमिकताओं के लिए एक अच्छा विचार हो सकता है, और यहां तक कि अगर वहाँ भी मेल खाता था, यह ऊपरी कार्रवाई प्रदर्शन करेंगे।
06/08/2008 को 01:42
का स्रोत उपयोगकर्ता

वोट
13

मैन्युअल रूप से पार्स शुरुआत में मज़ा ... का एक बहुत है :)

व्यवहार में अगर आदेशों बहुत परिष्कृत नहीं कर रहे हैं आप उन्हें आदेश पंक्ति दुभाषिए में उपयोग की जाती है उसी तरह का इलाज कर सकते हैं। : वहाँ पुस्तकालयों है कि आप उपयोग कर सकते हैं की एक सूची है http://java-source.net/open-source/command-line । मुझे लगता है कि आप के साथ शुरू कर सकते हैं Apache Commons CLI या args4j (एनोटेशन का उपयोग करता है)। वे अच्छी तरह से प्रलेखित और उपयोग में बहुत आसान कर रहे हैं। वे स्वचालित रूप से पार्स करने संभाल और केवल एक चीज आपको बस इतना करना एक वस्तु में विशेष क्षेत्रों को पढ़ने के लिए है।

आप और अधिक परिष्कृत आदेशों है, तो शायद एक औपचारिक व्याकरण बनाने के लिए एक बेहतर विचार होगा। वहाँ चित्रमय संपादक, डिबगर और व्याकरण के लिए दुभाषिया के साथ एक बहुत अच्छा पुस्तकालय है। यह कहा जाता है ANTLR (और संपादक ANTLRWorks ) और यह मुफ़्त है :) वहाँ भी कुछ उदाहरण व्याकरण और ट्यूटोरियल।

30/08/2008 को 23:26
का स्रोत उपयोगकर्ता

वोट
7

मैं देखेंगे जावा माइग्रेशन की ज़ोर्क , और एक सरल की ओर झुक प्राकृतिक भाषा प्रोसेसर जैसे (या तो tokenizing या रेगुलर एक्सप्रेशन द्वारा संचालित) (इस लिंक से) के बाद:

    सार्वजनिक स्थिर बूलियन simpleNLP (स्ट्रिंग inputline, स्ट्रिंग कीवर्ड [])
    {
        आई इंट;
        पूर्णांक maxToken = keywords.length;
        से करने के लिए int,;
        अगर (inputline.length () = inputline.length ()) return false; // खाली और खाली लाइनों के लिए जाँच
        जबकि (> = 0 तक)
        {
            = Inputline.indexOf ( ', से) करने के लिए;
            अगर (> 0) {
                lexed.addElement (inputline.substring (करने के लिए, से));
                = करने से;
                जबकि ((से) == 'inputline.charAt'
                && = keywords.length) {स्थिति = सच से; टूटना;}
            }
        }
        वापसी स्थिति;
    }

...

कुछ भी जो एक प्रोग्रामर पर ज़ोर्क फिर से मेरी किताब में अच्छा है देखने के लिए एक कारण देता है, बस Grues के लिए बाहर देखते हैं।

...

06/08/2008 को 01:16
का स्रोत उपयोगकर्ता

वोट
6

ANTLR / ANTLRWorks के लिए एक और वोट। आप वास्तव में आदेशों को क्रियान्वित करने के लिए जावा कोड के साथ एक दो फ़ाइल संस्करणों, और (सिर्फ व्याकरण के साथ) के बिना एक बना है, तो आप भाषा की एक निष्पादन विनिर्देश, जो परीक्षण के लिए प्रलेखन के लिए एक वरदान महान है, है , और आप कभी भी यह बंदरगाह करने का फैसला करता है, तो एक बड़ा timesaver।

31/08/2008 को 02:38
का स्रोत उपयोगकर्ता

वोट
6

सूर्य ही StringTokenizer से दूर रहने और बदले String.spilt पद्धति का उपयोग करके अनुशंसा करता है।

तुम भी पैटर्न वर्ग को देखने के लिए चाहता हूँ।

06/08/2008 को 17:14
का स्रोत उपयोगकर्ता

वोट
4

प्रयास करें JavaCC जावा के लिए एक पार्सर जेनरेटर।

यह भाषा की व्याख्या के लिए सुविधाओं की एक बहुत कुछ है, और यह अच्छी तरह से ग्रहण पर समर्थित है।

31/08/2008 को 20:45
का स्रोत उपयोगकर्ता

वोट
4

इस कमांड लाइन पार्स करने के लिए है, तो मैं का उपयोग कर सुझाव है कि कॉमन्स Cli

अपाचे कॉमन्स CLI पुस्तकालय प्रसंस्करण कमांड लाइन इंटरफेस के लिए एक API प्रदान करता है।

31/08/2008 को 02:05
का स्रोत उपयोगकर्ता

वोट
2

@CodingTheWheel यहाँ अपने कोड, थोड़ा साफ और ग्रहण के माध्यम से ( 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

विभाजन विधि निर्दिष्ट स्ट्रिंग अभिव्यक्ति की एक सरणी में एक स्ट्रिंग विभाजित कर सकते हैं regex। दो रूपों, अर्थात् में अपने तर्कों: विभाजन ( String regex) और विभाजन ( String regex, int limit) है, जो विभाजन ( String regex) है वास्तव में विभाजन (स्ट्रिंग regex, पूर्णांक सीमा) प्राप्त करने के लिए फोन करके, सीमा 0 है । तब, जब सीमा> 0 और सीमा <0 क्या प्रतिनिधित्व करता?

जब JDK समझाया, जब सीमा> 0 उप सरणी अप लंबाई सीमित करने के लिए, कि है, यदि संभव हो तो, हो सकता है सीमा -1 उप-मंडल, (सिवाय सीमा -1 द्वारा बार चरित्र स्ट्रिंग विभाजित हो गया है अंत) सबस्ट्रिंग के रूप में शेष ;

सीमा <0 सरणी की लंबाई पर कोई सीमा नहीं संकेत करता है;

सीमा = 0 स्ट्रिंग खाली स्ट्रिंग के अंत काट दिया जाएगा। StringTokenizerवर्ग संगतता कारणों के लिए है और विरासत वर्ग संरक्षित है, तो हम स्ट्रिंग वर्ग के विभाजन विधि का उपयोग करने का प्रयास करना चाहिए। का उल्लेख लिंक

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

जब आदेश के लिए विभाजक स्ट्रिंग allways एक ही स्ट्रिंग या चार है (जैसे ",") y की सिफारिश आप StrinkTokenizer वर्ग का उपयोग करें:

StringTokenizer

लेकिन जब विभाजक भिन्न होता है या जटिल y सुझाव है कि आप नियमित रूप से expresions उपयोग करने के लिए है, जो स्ट्रिंग वर्ग ही है, विधि विभाजन से, 1.4 के बाद से इस्तेमाल किया जा सकता। यह 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