2008-09-20 18 views
7

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

उदाहरण के लिए, अगर मेरे regex "abc" था और मुझे लगता है कि मैच के लिए "अब्द" के साथ करने की कोशिश की मैच सूचकांक पर विफल हो जाएगा स्पष्टीकरण के लिए 2.

संपादित करें। मुझे इसकी आवश्यकता है कि मुझे अपने आवेदन के पार्सिंग घटक को सरल बनाने दें। एप्लिकेशन एक Assmebly भाषा शिक्षण उपकरण है जो छात्रों को कार्यक्रमों की तरह असेंबली लिखने, संकलित करने और निष्पादित करने की अनुमति देता है।

वर्तमान में मेरे पास टोकननाइज़र क्लास है जो इनपुट स्ट्रिंग्स को रीगेक्स का उपयोग करके टोकन में परिवर्तित करती है। यह बहुत अच्छी तरह से काम करता है। उदाहरण के लिए:

tokenizer का उत्पादन करेगा निम्नलिखित टोकन निम्न इनपुट = "INP: x:" दिया
:

Token.OPCODE, Token.WHITESPACE, Token.LABEL, Token.EOL 

ये टोकन तो सुनिश्चित करें कि वे किसी दिए गए बयान के लिए एक वाक्य रचना के अनुरूप विश्लेषण किया जाता है । वर्तमान में यह आईएफ स्टेटमेंट का उपयोग करके किया जाता है और बोझिल साबित होता है। इस दृष्टिकोण का उछाल यह है कि मैं विस्तृत त्रुटि संदेश प्रदान कर सकता हूं। आईई

if(token[2] != Token.LABEL) { throw new SyntaxError("Expected label");} 

मैं कष्टप्रद IF कथन के बजाय एक वाक्यविन्यास को परिभाषित करने के लिए नियमित अभिव्यक्ति का उपयोग करना चाहता हूं। लेकिन ऐसा करने में मैं विस्तृत त्रुटि रिपोर्ट वापस करने की क्षमता खो देता हूं। इसलिए मैं कम से कम त्रुटि के उपयोगकर्ता को सूचित करना चाहता हूं।

+0

मैं क्या यह वास्तव में आसान निकला पता करने के लिए दिलचस्पी होगी। किसी कंपाइलर के लिए कोड को कभी नहीं देखा, मेरा अनुमान है कि कोड जो उनके त्रुटि संदेशों को उत्पन्न करता है, वह अक्सर आपके जैसा ही दिखता है। – harpo

+0

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

उत्तर

4

मैं कॉलिन यंगर से सहमत हूं, मुझे नहीं लगता कि यह मौजूदा रेगेक्स वर्ग के साथ संभव है। हालांकि, मुझे लगता है कि यह संभव है यदि आप एक छोटे से पसीना करने को तैयार हैं:

  1. Regex वर्ग स्रोत कोड (जैसे http://www.codeplex.com/NetMassDownloader नेट स्रोत डाउनलोड करने के लिए) प्राप्त करें।
  2. विफलता सूचकांक के साथ एक readonly संपत्ति रखने के लिए कोड बदलें।
  3. सुनिश्चित करें कि आपका कोड माइक्रोसॉफ्ट के बजाए Regex का उपयोग करता है।
1

मुझे लगता है कि इस तरह की एक इंडेक्स का मतलब केवल कुछ साधारण मामलों में होगा, जैसे कि आपके उदाहरण में।

यदि आप "ab * c * z" (जहां से * मेरा मतलब है किसी भी चरित्र) और एक स्ट्रिंग "abbbcbbcdd" जैसे रेगेक्स ले लेंगे, तो इंडेक्स क्या होना चाहिए, आप किस बारे में बात कर रहे हैं? यह mathcing के लिए इस्तेमाल किया एल्गोरिथ्म पर निर्भर करेगा ... "abbbc ..." पर या पर विफल कर सका "abbbcbbc ..."

+0

मैं चाहता हूं कि पहली अनुक्रमणिका बाएं से दाएं हो। आपके उदाहरण में मेरा मानना ​​है कि "abbbcbbcdd" उस बिंदु तक ठीक से मेल खाता है जहां रेगेक्स को 'z' वर्ण की आवश्यकता होती है। –

0

मैं यह संभव है पर विश्वास नहीं है, लेकिन मैं intrigued रहा हूँ आप क्यों करेंगे यह चाहता हूँ।

+0

मैंने अपने प्रश्न में एक संक्षिप्त सारांश क्यों जोड़ा। आपके उत्तर के लिए चीयर्स –

0

ऐसा करने के लिए आपको रेगेक्स में एम्बेडेड कॉलबैक की आवश्यकता होगी (जो AFAIK C# समर्थन नहीं करता है) या अधिमानतः रेगेक्स इंजन में हुक करता है। फिर भी, यह स्पष्ट नहीं है कि बैकट्रैकिंग शामिल होने पर आप क्या चाहते हैं।

0

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

मैं उसी समस्या में भाग गया आपके उत्तर में आया और मुझे अपना स्वयं का समाधान करना पड़ा। संदेश यह है:

https://stackoverflow.com/a/11730035/637142

आशा है कि यह मदद करता है

संबंधित मुद्दे