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

प्लेयर कमांड को पार्स करने के लिए, मैंने अक्सर विभाजित विधि delimiters द्वारा स्ट्रिंग को विभाजित करने के लिए और उसके बाद बस if s या switch </कोड> तों। जावा में तारों को पार्स करने के कुछ अलग तरीके क्या हैं?

0
जोड़ा संपादित
विचारों: 4
मैंने सवाल को संपादित करने का प्रयास किया है ताकि इसे राय-आधारित होने से दूर कर दिया जा सके, लेकिन मुझे डर है कि जवाब पहले से ही बहुत ही विचार किए गए हैं।
जोड़ा लेखक agweber, स्रोत

14 उत्तर

रिक्त स्थान पर एक साधारण स्ट्रिंग टोकनेज़र काम करना चाहिए, लेकिन वास्तव में आप इसे करने के कई तरीके हैं।

टोकननाइज़र का उपयोग करके यहां एक उदाहरण दिया गया है:

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

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

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

फिर तर्कों के लिए टोकन का और उपयोग किया जा सकता है। यह सब मानते हैं कि तर्कों में कोई रिक्त स्थान नहीं उपयोग किया जाता है ... ताकि आप अपनी खुद की सरल पार्सिंग तंत्र को रोल करना चाहें (जैसे पहला व्हाइटस्पेस प्राप्त करना और कार्रवाई के पहले टेक्स्ट का उपयोग करना, या नियमित अभिव्यक्ति का उपयोग करना यदि आपको कोई फर्क नहीं पड़ता गति हिट), बस इसे अमूर्त करें ताकि इसे कहीं भी इस्तेमाल किया जा सके।

0
जोड़ा
जहां तक ​​मुझे याद है कि 'स्ट्रिंगटोकनाइज़र' को प्रदर्शित किया गया है और अत्यधिक अनुशंसा की जाती है कि इसे जेडीके दस्तावेज़ों द्वारा उपयोग न करें।
जोड़ा लेखक Ali Motevallian, स्रोत

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

  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
जोड़ा

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

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

0
जोड़ा
अगर नए नियमों की मदद के लिए कुछ उदाहरण कोड दिए गए तो मुझे इसे उत्तर के रूप में स्वीकार करना अच्छा लगेगा।
जोड़ा लेखक agweber, स्रोत
@ गौरव वशिष्ठ, नियमित अभिव्यक्ति lexing के लिए उपयोगी हो सकती है लेकिन यह पार्सिंग में केवल पहला कदम है ।
जोड़ा लेखक Mike Samuel, स्रोत

@ कोडिंग दहेल आपका कोड, थोड़ा साफ और ग्रहण के माध्यम से ( ctrl + shift + f ) और यहां वापस डाला गया है :)

प्रत्येक पंक्ति के सामने चार रिक्त स्थान शामिल हैं।

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
जोड़ा

जब आदेश के लिए विभाजक स्ट्रिंग हमेशा एक ही स्ट्रिंग या चार (जैसे ";") y की सिफारिश करता है तो आप स्ट्रिंकटोकनाइज़र क्लास का उपयोग करते हैं:

स्ट्रिंगटोकनाइज़र

लेकिन जब विभाजक भिन्न होता है या जटिल होता है तो आप नियमित रूप से विस्तार का उपयोग करने के लिए पुनः प्रयास करते हैं, जिसका उपयोग स्ट्रिंग क्लास द्वारा ही किया जा सकता है, विधि 1.4 से 1.4 हो सकता है। यह java.util.regex पैकेज से पैटर्न वर्ग का उपयोग करता है

पैटर्न

0
जोड़ा

सूर्य स्वयं स्ट्रिंगटोकनाइज़र से दूर रहने और इसके बजाय String.spilt विधि का उपयोग करने की सिफारिश करता है।

आप पैटर्न कक्षा को भी देखना चाहेंगे।

0
जोड़ा

यदि आपके टेक्स्ट में कुछ डिलीमीटर हैं तो आप अपनी विभाजित विधि कर सकते हैं।
यदि पाठ में अनियमित स्ट्रिंग्स का अर्थ है तो इसमें अलग प्रारूप है, तो आपको नियमित अभिव्यक्ति का उपयोग करना होगा।

0
जोड़ा

अगर भाषा बस की तरह सरल है

क्रिया संज्ञा

फिर हाथ से विभाजित अच्छी तरह से काम करता है।

यदि यह अधिक जटिल है, तो आपको वास्तव में एएनटीएलआर या जावासीसी जैसे टूल में देखना चाहिए।

मुझे http://javadude.com/articles/antlrtut जो आपको एक विचार देगा कि यह कैसे काम करता है।

0
जोड़ा

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

0
जोड़ा

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

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

0
जोड़ा

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

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

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

0
जोड़ा

यदि यह कमांड लाइनों को पार्स करना है तो मैं कॉमन्स क्ली का उपयोग करने का सुझाव दूंगा।

अपाचे कॉमन्स सीएलआई लाइब्रेरी कमांड लाइन इंटरफेस को प्रोसेस करने के लिए एक एपीआई प्रदान करती है।

0
जोड़ा

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

0
जोड़ा

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
जोड़ा