2009-02-05 31 views
11

मेरे पास एम्बेडेड संख्याओं के साथ तारों का एक सेट है। वे कुछ/कैल/लम्बा/3/4/145: 99 9 या/पी/मेट्रिक्स/कॉस्मिकरे/24: 4: बीजीपी: एनर्जीकर्टोसिस जैसे कुछ दिखते हैं। मुझे एक अभिव्यक्ति पार्सर होना चाहिए जोनियमित अभिव्यक्तियों के विकल्प

  • उपयोग करने में आसान है। कुछ उदाहरणों को देखते हुए किसी को एक नई अभिव्यक्ति बनाने में सक्षम होना चाहिए। मैं अंत उपयोगकर्ताओं को तारों के इस सेट को क्वेरी करने के लिए नए अभिव्यक्तियों को बनाने में सक्षम होना चाहता हूं। कुछ संभावित उपयोगकर्ता सॉफ्टवेयर इंजीनियर हैं, अन्य टेस्टर्स हैं और कुछ वैज्ञानिक हैं।
  • संख्याओं पर बाधाओं की अनुमति देता है। कुछ/'cal/long/3/4/143: #> 100 & < 1110' निर्दिष्ट करने के लिए कि '/ cal/long/3/4/143:' के साथ एक स्ट्रिंग उपसर्ग निर्दिष्ट करें और उसके बाद एक संख्या (100,1110) अपेक्षित है।
  • '|' का समर्थन करता है और । तो अभिव्यक्ति '/ cal/(long | short)/3/4/' मिलान '/ cal/long/3/4/1: 2' साथ ही '/ cal/short/3/4/1: 2 '।
  • जावा कार्यान्वयन उपलब्ध है या जावा में लागू करना आसान होगा।

दिलचस्प वैकल्पिक विचार उपयोगी होंगे। मैं नियमित अभिव्यक्तियों के सबसेट को लागू करने के विचार को भी मनोरंजक कर रहा हूं जिसे मुझे संख्यात्मक बाधाओं की आवश्यकता है।

धन्यवाद!

+1

यह नियमित अभिव्यक्तियों के लिए डिज़ाइन किया गया था। – mmcdole

+1

मुझे समझ में नहीं आ रहा है कि आप नियमित अभिव्यक्तियों का विकल्प क्यों चाहते हैं। यदि आप इसे समझा सकते हैं, तो शायद यह हमें एक अच्छा जवाब देने में मदद करेगा। मेरा सुझाव सिर्फ रेगेक्स के सबसेट का उपयोग करता है जो आपकी आवश्यकताओं के अनुरूप है। – skiphoppy

+0

आह; मैं समझ गया। आपकी सूची में # 2 सबसे सामान्य रेगेक्स इंजन की सीमाओं से परे है। :) – skiphoppy

उत्तर

4

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

आप क्लासिक लेक्स और yacc जैसी चीजों को एक पार्सर जनरेटर पर विचार करना चाहेंगे।मैं जावा विकल्पों के साथ वास्तव में परिचित नहीं हूँ, लेकिन यहाँ एक सूची है:

http://java-source.net/open-source/parser-generators

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

आपके मामले में, मैं पार्सर की कल्पना करता हूं जिसके परिणामस्वरूप नियमित अभिव्यक्ति और अतिरिक्त स्थितियों का संयोजन होता है। आपके संख्यात्मक बाधा उदाहरण के लिए, यह आपको नियमित अभिव्यक्ति \/cal/long/3/4/143:(\d+)\ और पहले समूह (\d+ भाग) पर लागू करने की बाधा प्रदान कर सकता है जिसके लिए यह संख्या 100 और 1100 के बीच होती है। इसके बाद आप आरई को अपने तारों पर लागू करेंगे उम्मीदवारों, और अपने मैचों को खोजने के लिए उन उम्मीदवारों को बाधा लागू करें।

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

+0

यह एक उपयोगी लिंक है। धन्यवाद! –

7

पहिया को फिर से शुरू करने का कोई कारण नहीं है! एक नियमित अभिव्यक्ति इंजन का मूल गणित और कंप्यूटर विज्ञान की एक मजबूत नींव पर बनाया गया है; आज हम उनका उपयोग जारी रखने का कारण यह है कि वे मुख्य रूप से ध्वनि हैं और भविष्य में भविष्य में सुधार नहीं किए जाएंगे।

यदि आप कुछ वैकल्पिक पार्सिंग भाषा पाते हैं या बनाते हैं जो केवल रेगेक्स की संभावनाओं का एक सबसेट शामिल कर सकता है, तो आप जल्दी से एक अवधारणा मांगने वाले उपयोगकर्ता को रेगेक्स में व्यक्त किया जा सकता है लेकिन आपका स्वाद सिर्फ सादा छोड़ देता है। अपने समय को सुलझाने वाली समस्याओं को बिताएं जिन्हें हल नहीं किया गया है!

+18

नियमित अभिव्यक्ति गणितीय ध्वनि और तेज़ हैं। लेकिन वे उपयोग और रखरखाव की आसानी के मामले में * वास्तव में कठिन * चूसना। वे उस संबंध में शुद्ध बुराई हैं। Thats क्यों reinvent करने का एक कारण है। –

+3

@ बीटी जिसे किसी भी भाषा के लिए कहा जा सकता है जो इसे कहने वाले व्यक्ति से परिचित नहीं है। –

+8

मैं असहमत हूं। Regex कम से कम संक्षिप्त और पढ़ने के लिए मुश्किल पर है। यह एक राय बात है, मुझे विश्वास है, लेकिन मैंने उन्हें सीखा है, उन्हें बेकार किया है, उन्हें छोड़ दिया है। –

0

असल में आपने जो वर्णन किया वह जावा Pattern Matcher है। रेगेक्स को अपनी भाषा के रूप में उपयोग करने के लिए कौन सा होता है।

+0

जहां तक ​​मैं कह सकता हूं कि पैटर्न का उपयोग करने वाले व्याकरण को बढ़ाने या बदलने का कोई तरीका नहीं है। –

+0

मुझे समझ में नहीं आता कि आप क्यों चाहते हैं, लेकिन आप पैटर्न में वर्रों को खींचने में सक्षम होना चाहिए, जो इसे बढ़ाएगा। जावा पैटर्न मैचर सबसे कुशल RegEx उपकरण में से एक है। महान में से एक के साथ जावा में गड़बड़ करने के लिए बहुत सारी बुरी चीजें हैं। – WolfmanDragon

2

दुर्भाग्यवश, सभी प्रोग्रामर (स्वयं शामिल नहीं) रेगेक्स से परिचित नहीं हैं जैसा कि उन्हें होना चाहिए। इसका अक्सर अर्थ है कि हम अपने स्वयं के स्ट्रिंग-पार्सिंग तर्क लिखते हैं जहां RegEx अन्यथा हमें अच्छी तरह से सेवा दे सकता है।

यह हमेशा बुरा नहीं होता है। कुछ मामलों में डीएसएल (एक वर्ग, विधियों का एक संयोजक सेट) लिखना संभव है जो अधिक सुरुचिपूर्ण और पठनीय है और आपकी समस्या डोमेन की सटीक आवश्यकताओं को पूरा करता है। समस्या यह है कि समस्या को डीएसएल में सुलझाने के लिए दर्जनों पुनरावृत्तियों को लेना सरल और सहज है। और केवल अगर डीएसएल का उपयोग आवेदन में या बड़े समुदाय द्वारा दूर और व्यापक रूप से किया जाएगा तो यह समस्या जरूरी है। ऐसी समस्या का एक सुरुचिपूर्ण समाधान न लिखें जो केवल स्पोरैडिक रूप से दिखाई देता है।

+1

मैंने इस संदर्भ में डीएसएल शब्द को पहले नहीं सुना है। इससे कुछ उपयोगी गुगल हो गया है। धन्यवाद! –

4

जावा बाधा एक गंभीर है। मैं पार्सिंग संयोजक का उपयोग करने की अनुशंसा करता हूं, लेकिन आपको कार्यों के बजाए कक्षाओं का उपयोग करके विचारों को जावा में अनुवाद करना होगा। इस विषय पर कई सारे पेपर उपलब्ध हैं; दृष्टिकोण के सबसे आसान में से एक Graham Hutton's Higher-Order Functions for Parsing है। हटन के दृष्टिकोण से आप किसी उदाहरण की परिमाण जैसी स्थितियों के आधार पर सफल होने या विफल होने का निर्णय लेना विशेष रूप से आसान बनाते हैं, जैसा कि आप अपने उदाहरण में दिखाते हैं।

0

यदि आप पार्सर मार्ग पर जा रहे हैं, तो गोल्ड पार्सिंग सिस्टम देखें। यह अक्सर वाईएसीसी, शुद्ध रेजेक्स की तुलना में क्लीनर की तुलना में बेहतर विकल्प है, और जावा का समर्थन करता है।

http://goldparser.org/about/how-it-works.htm

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