2015-05-27 7 views
5

में कई बार शुरू नहीं होने वाली प्रतिस्थापन को प्रतिस्थापित किया है। मैं जावास्क्रिप्ट में एक प्रकार का पार्सर बना रहा हूं जो स्क्रिप्ट के रूप में स्क्रिप्ट को गणितीय अभिव्यक्ति लेता है, और इसका मूल्यांकन करता है और इसके साथ कुछ अन्य चीजें करता है। यदि उपयोगकर्ता बिल्टिन जावास्क्रिप्ट गणितीय फ़ंक्शंस का उपयोग करना चाहते हैं, तो उन्हें निम्न स्ट्रिंग दर्ज करना होगा उदा। "1 + Math.log (x)"। जब चीजें घोंसला होती हैं तो यह बहुत कठिन हो जाता है जैसे "Math.abs (Math.log (Math.pow (x, 2))) + Math.log2 (x)"। जैसा कि आप देख सकते हैं, "गणित।" इसका हिस्सा न केवल लिखने में अधिक समय लगता है, बल्कि इसे कम पठनीय बनाता है। मैं उस "गणित" को हटाना चाहता हूं। अंश। जिस तरह से मैंने इसे किया है वह सरल रेगेक्स का उपयोग कर रहा है जिसमें मूल रूप से सभी जावास्क्रिप्ट मैथ स्थिरांक और विधियों की एक सूची है और बस "गणित" को तैयार करता है। इसे का हिस्सा। काफी सरल:रेगेक्स ने

input = input.replace(/(E|PI|SQRT2|SQRT1_2|LN2|LN10|LOG2E|LOG10E)/g, "Math.$1"); 

वही चीजें विधियों के लिए होती हैं। यह ठीक काम करता है। लेकिन हमेशा के रूप में यह बहुत लचीला नहीं है और गलतफहमी के लिए जगह छोड़ देता है और कोई भी साथ मिल सकता है और Math.log (x) टाइप करने पर जोर दे सकता है जिसे बदले में Math.Math.log (x) के साथ प्रतिस्थापित किया जाएगा, जो काम नहीं करेगा।

जो मैं जानना चाहता हूं, क्या इन पूर्वनिर्धारित तारों (स्थिरांक और विधियों) से मेल खाने का कोई तरीका है ताकि वे केवल "गणित" न होने पर रीगेक्स के माध्यम से मेल खाए जाएंगे। इसके सामने हिस्सा। मैं इस

^(?!Math\.)(log2|log|exp|abs) 

की कोशिश की है, लेकिन यह काफी बेकार है, के रूप में इस घोंसले और यहां तक ​​कि कई ऑपरेंड साथ काम नहीं करता। क्या यह पूरी तरह से रेगेक्स में ऐसा करने का कोई तरीका है, क्योंकि इससे पूरी प्रक्रिया अधिक सुरुचिपूर्ण हो जाएगी। किसी भी सहायता की सराहना की जाएगी।

+0

क्या सिर्फ इस पहली करने के बारे में? 'input.replace (/ \ bmath \ ./ g, '') 'फिर regex जो इसे जोड़ता है। –

+0

क्या होता है यदि कोई उपयोगकर्ता आपकी सूची में किसी चीज़ में निःशुल्क प्रकार के साथ आता है? यह उपयोगकर्ताओं को उनके फॉर्मूला में प्रवेश करने की अनुमति देने का एक बहुत बुरा तरीका है। जब तक आप वैधता के लिए हर अंतिम चरित्र को पूरी तरह से पार्स नहीं करते, मैं ऐसा नहीं करता। यदि आपका आलसी है, तो उन कार्यों के लिए ड्रॉपडाउन सूची बनाएं और जिनसे वे चुन सकते हैं। – sln

+0

यह निश्चित रूप से काम करेगा, लेकिन यह बहुत ही सुरुचिपूर्ण नहीं होगा, यह एक लाइन के भीतर इसे करने के लिए क्लीनर लगता है। दिया गया जवाब वही करता है जो मैं एक बहुत साफ तरीके से चाहता था। – Pavlin

उत्तर

7

आप निम्न चाल का उपयोग कर सकते हैं ताकि यह प्रतिस्थापित हो जाता है, भले ही यह मेल खाता है या नहीं:

(?:Math\.)?(log2|log|exp|abs|pow) 

और Math.$1

के साथ बदलें देखें DEMO

+0

बहुत बहुत धन्यवाद, यह पूरी तरह से काम करता है। – Pavlin

+0

मदद करने के लिए खुश :) –