2010-02-19 18 views
12

क्या (यानी जावा के फ्लोट) की तरहकैसे एक रेगुलर एक्सप्रेशन का उपयोग कर एक चल बिन्दु संख्या का पता लगाने के

एक चल बिन्दु संख्या से निपटने के जवाब निम्नलिखित लक्ष्यों के खिलाफ मेल खाना चाहिए के लिए एक अच्छा नियमित अभिव्यक्ति है:

1) 1. 
2) .2 
3) 3.14 
4) 5e6 
5) 5e-6 
6) 5E+6 
7) 7.e8 
8) 9.0E-10 
9) .11e12 

सारांश में, यह

  • पूर्ववर्ती संकेत अनदेखा कर देना चाहिए
  • के बाईं ओर पहला वर्ण की आवश्यकता होती है दशमलव बिंदु होने के लिए गैर शून्य
  • एक दशमलव बिंदु
  • वैज्ञानिक संकेतन की अनुमति देने के बिना एक नंबर की अनुमति दशमलव बिंदु
  • के दोनों तरफ 0 या अधिक अंकों की अनुमति देने के
  • अनुमति देने के बड़े या लोअरकेस 'ई'
  • सकारात्मक या नकारात्मक घातांक अनुमति देते हैं

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

[एपिलोग] मेरा समाधान पूर्ण क्रेडिट नहीं मिला क्योंकि यह दशमलव के बाईं ओर 1 से अधिक अंक नहीं संभालता था। असाइनमेंट ने जावा फ्लोट को संभालने का जिक्र किया था, भले ही इनमें से कोई भी उदाहरण दशमलव के बाईं ओर 1 अंकों से अधिक न हो। मैं स्वीकार किए गए उत्तर को अपनी पोस्ट में पोस्ट करूंगा।

+0

मैं व्यक्तिगत रूप से इकाई परीक्षण ... –

+0

का एक समूह इन बहुत ही अजीब आवश्यकताएँ हैं लिखेंगे। ऐसी अभिव्यक्ति "0.5" से मेल नहीं खाती है। – user763305

उत्तर

7

[यह प्रोफेसर से जवाब है] को परिभाषित करें:

012,

एन = [1-9]
डी = 0 | एन
ई = [ईई] [+ -]? डी
एल = 0 | (एन डी *)

फिर चल बिन्दु संख्या के साथ मिलान किया जा सकता है: (।।? (एल डी * | डी +) ई)

| (एल ई)

एल के बजाए डी + का उपयोग करने और [+ -] प्रीपेड करने के लिए भी स्वीकार्य था?

डी * लिखना एक आम गलती थी। डी *, लेकिन यह सिर्फ '।' से मेल खा सकता है।

[संपादित करें]
किसी ने एक प्रमुख संकेत के बारे में पूछा; मुझे उनसे पूछा जाना चाहिए कि इसे क्यों बाहर रखा गया था लेकिन कभी मौका नहीं मिला। चूंकि यह व्याकरण पर व्याख्यान का हिस्सा था, मेरा अनुमान है कि या तो यह समस्या को आसान बना देता है (संभावना नहीं है) या पार्सिंग में एक छोटी सी जानकारी है जहां आप समस्या सेट को विभाजित करते हैं जैसे फ्लोटिंग पॉइंट वैल्यू, साइन के बावजूद, फोकस (संभव)।

यदि आप अभिव्यक्ति के माध्यम से विश्लेषण कर रहे हैं, उदा।

-5.04e-10 + 3।14159E10

फ़्लोटिंग पॉइंट वैल्यू का संकेत ऑपरेशन का हिस्सा है, जो कि मूल्य पर लागू होता है, न कि संख्या की विशेषता। दूसरे शब्दों में,

घटाना (5.04e -10)
ऐड (3.14159E10)

अभिव्यक्ति का परिणाम के रूप में। जबकि मुझे यकीन है कि गणितज्ञ इस बिंदु पर बहस कर सकते हैं, याद रखें कि यह पार्सिंग पर एक व्याख्यान से था।

+0

इन्फिनिटी और नाएन के बारे में क्या? –

+0

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

23

बस दोनों दशमलव डॉट और ई-तो-प्रतिपादक हिस्सा वैकल्पिक बनाने:

[1-9][0-9]*\.?[0-9]*([Ee][+-]?[0-9]+)? 

मैं नहीं दिख रहा है कि क्यों आप नहीं चाहते एक अग्रणी [+-]? भी एक संभव संकेत कब्जा करने के लिए है, लेकिन, जो कुछ भी -)

संपादित:! वहाँ वास्तव में कोई अंक दशमलव बिंदु के छोड़ दिया (इस स्थिति में मैं कल्पना वहाँ यह बाद और 1+ अंक दशमलव बिंदु होना चाहिए) हो सकता है तो, एक लंबवत-बार (वैकल्पिक) i स्पष्ट रूप से आवश्यक:

(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)? 
+2

ध्यान दें कि यह '.x' या '0.x' रूप से कुछ भी मेल नहीं खाता है। –

+4

@Alex: वह "5-2.5" में अभिव्यक्ति का हिस्सा होने पर साइन इन नहीं करना चाहेंगे। यह अपेक्षा की जाती है कि यदि आप एक कंपाइलर लिखते समय चीजें टोकनिंग कर रहे हैं। –

+0

@Anon, दाएं: '0.x' दूसरे नियम द्वारा खारिज कर दिया जाना चाहिए। –

2

यहां मैंने जो किया है वह यहां है।

(([1-9]+\.[0-9]*)|([1-9]*\.[0-9]+)|([1-9]+))([eE][-+]?[0-9]+)? 

यह आसान चर्चा करने के लिए बनाने के लिए, मैं नामांकित कर देंगे वर्गों

(([1-9]+ \. [0-9]*) | ([1-9]* \. [0-9]+) | ([1-9]+)) ([eE] [-+]? [0-9]+)?  
-------------------------------------------------------- ----------------------  
         A          B 

एक: 'ई/ई'
बी करने के लिए सब कुछ मेल खाता है: वैज्ञानिक संकेतन से मेल खाता है

ए ब्रेकिंग ए हम तीन भागों

(([1-9]+ \. [0-9]*) | ([1-9]* \. [0-9]+) | ([1-9]+)) 
    ----------1---------- ---------2---------- ---3---- 

भाग 1: 1 ओ की अनुमति देता है दशमलव के बाद 1-9, दशमलव, 0 या अधिक अंक से अधिक अंक (लक्ष्य 1) ​​
भाग 2: दशमलव के बाद 1 या 9, दशमलव, 1 या अधिक अंकों से 0 या अधिक अंक की अनुमति देता है (लक्ष्य 2)
भाग 3: की अनुमति देता है कोई दशमलव के साथ 1-9 से 1 या अधिक अंकों (लक्ष्य सूची में # 4 देखें)


नीचे बी तोड़कर हम 4 बुनियादी भागों

([eE] [-+]? [0-9]+ )? 
    ..--1- --2-- --3--- -4- .. 

भाग 1 मिलता है: आवश्यकता है या तो वैज्ञानिक नोटेशन के लिए ऊपरी या लोअरकेस 'ई' (उदाहरण के लिए लक्ष्य 8 & 9)
भाग 2: प्रतिपादक के लिए एक वैकल्पिक सकारात्मक या नकारात्मक संकेत की अनुमति देता है (उदाहरण के लिए 4 को लक्षित करता है, 5, & 6)
भाग 3: प्रतिपादक (लक्ष्य 8)
भाग के लिए 1 या अधिक अंकों की अनुमति देता है 4: (लक्ष्य 3) वैज्ञानिक अंकन एक समूह के रूप वैकल्पिक होने की अनुमति देता

+0

(ए) का आपका पहला भाग (1) '10.' की अनुमति नहीं देता है। – tur1ng

+0

भाग (1) (ए) शायद '([1-9] [0-9] * \। [0-9] *) होना चाहिए। भाग (3) के लिए एक समान परिवर्तन की आवश्यकता है। –

+0

@ tur1ng: सच है लेकिन परीक्षण इनपुट को दोष दें! 8-) –

1
'([-+])?\d*(\.)?\d+(([eE]([-+])?)?\d+)?' 

मैटलैब में इस तरह के कार्य को हल करने की कोशिश करते समय मैं नियमित अभिव्यक्ति करता हूं।

'([-+])?(\d+(\.)?\d*|\d*(\.)?\d+)(([eE]([-+])?)?\d+)?' 
1

@Kelly एस फ्रेंच: वास्तव में, यह सही ढंग से की तरह (1.) लेकिन कुछ अतिरिक्त परिवर्तन की समस्या का समाधान हो सकता है ... अच्छी तरह से, हो सकता है निम्नलिखित है कि ठीक होता संख्या का पता नहीं लगा होगा संकेत है गायब है क्योंकि एक पार्सर में यह यूनरी माइनस (अस्वीकृति) अभिव्यक्ति द्वारा जोड़ा जाएगा, इसलिए फ्लोट के हिस्से के रूप में यह पता लगाने में असमर्थ नहीं है।

1

@ केली एस फ्रेंच, यह नियमित अभिव्यक्ति आपके सभी परीक्षण मामलों से मेल खाती है।

^[+-]?(\d+\.\d+|\d+\.|\.\d+|\d+)([eE][+-]?\d+)?$ 

स्रोत: perldoc perlretut

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