2010-08-23 24 views
6

मैं नियमित रूप से अभिव्यक्तियों पर एक नौसिखिया हूं, इसलिए इस पर कुछ सहकर्मी प्रतिक्रिया की सराहना करेंगे। यह मेरी साइट पर भारी रूप से उपयोग किया जाएगा, इसलिए किसी भी अजीब किनारे के मामलों में पूरी तरह से विनाश हो सकता है। विचार पूरी इकाइयों या अंशों में एक नुस्खा में एक घटक की मात्रा में टाइप करना है। मेरे स्वत: पूर्ण तंत्र के कारण, केवल एक संख्या मान्य है (क्योंकि यह एक ड्रॉपडाउन पॉप अप करेगा)। ये लाइनें मान्य हैं:इस नियमित अभिव्यक्ति को बेहतर बनाने के लिए कोई तरीका?

1 
1/2 
1 1/2 
4 cups 
4 1/2 cups 
10 3/4 cups sliced 

लाइन के संख्यात्मक भाग का अपना समूह होना चाहिए इसलिए मैं उस पार्स कर सकते हैं मेरी अंश पार्सर के साथ। संख्यात्मक भाग के बाद सब कुछ एक दूसरा समूह होना चाहिए।

^\s*(\d+|\d+\/\d+|\d+\s*\d+\/\d+)\s*(.*)$ 

यह लगभग काम करता है, लेकिन "1 1/2 कप" के रूप में (1) (1/2 कप) के बजाय (1 1/2) और (कप पार्स हो जाएगी: सबसे पहले, मैं इस कोशिश की)। मेरे सिर को थोड़ा खरोंचने के बाद, मैंने यह निर्धारित किया कि यह मेरे "या" खंड के आदेश के कारण था। (1) \ d + और (। *) को संतुष्ट करता है बाकी को संतुष्ट करता है।

^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*([a-z].*)$ 

यह लगभग काम करता है, लेकिन जैसा कि "1 1/2/4 कप" या "1/2 3 कप" weirdness इस तरह की अनुमति देता है: तो मैं करने के लिए इस बदल दिया है। इसलिए मैं मान्य संख्या अभिव्यक्ति के बाद पहली चरित्र के रूप में एक पत्र को लागू करने का फैसला किया:

^\s*(\d+\/\d+|\d+\s*\d+\/\d+|\d+)\s*($|[a-z].*)$ 

नोट मैं केस-संवेदी मोड में इस चल रहा हूँ। यहां मेरे प्रश्न हैं:

  1. क्या अभिव्यक्ति में सुधार किया जा सकता है? मुझे थोड़े, संख्या, अंश, यौगिक अंश के लिए "OR" सूची पसंद नहीं है, लेकिन मैं पूरी संख्या, अंश, या यौगिक अंशों की अनुमति देने के तरीके के बारे में सोच नहीं सकता था।

  2. यह अच्छा होगा अगर मैं संख्यात्मक घटक के बाद प्रत्येक शब्द के लिए समूह वापस कर सकता हूं। जैसे समूह (10 3/4), (कप) के लिए एक समूह और (कटा हुआ) के लिए एक समूह के रूप में। बाद में शब्दों की संख्या हो सकती है। क्या यह संभव है?

धन्यवाद!

+0

ओह उफ़, याद किया एक और मामला .. राशि दशमलव में व्यक्त किया जा सकता है। तो मैं एक और या खंड जोड़ दिया है: ^ \ s * (। \ D + \/\ d + | \ d + \ s * \ d + \/\ d + | \ d + | \ d * \ \ घ) \ s * ($ |। [az] *) $ –

उत्तर

3

ठीक है, ऐसा लगता है कि आपको बिल्कुल या शर्तों की आवश्यकता नहीं है (लेकिन नीचे देखें)।

सांख्यिक बिट के लिए, आप के साथ भाग मिल सकता है:

\d+(\s+\d+/\d+) 

जो उन सभी आंशिक मानों का प्रबंधन करेगा।

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

^\s*((\d+\s)?(\d+/\d+)?|\d+(\.\d+)?)\s*([a-z].*)?$ 
| |     |   | | 
| |     |   | +--- start of alpha section. 
| |     |   +------ optional white space. 
| |     +------------------ decimal (nn[.nn]) 
| +------------------------------------- fractional ([nn ][nn/nn]) 
+----------------------------------------- optional starting space. 

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

मैं अपने आप को ($|[a-z].*)$ को ([a-z].*)?$ निर्माण पसंद करते हैं, लेकिन वह सिर्फ :-)


मेरी आरई में एक से अधिक लाइन अंत मार्करों के लिए लेकिन सब ईमानदारी में, मेरे अतीत पर एक से बचने हो सकता है, मैं आपको लगता है यहां एक थर्मो-परमाणु हथियार के साथ एक फ्लाई swat करने की कोशिश कर रहा है।

आप वास्तव में प्रतिबंधित करने के लिए अपने द्वारा दर्ज हो जाता है की आवश्यकता है। मैंने व्यंजनों को देखा है जो a pinch of salt और a handful of sultanas के लिए कॉल करते हैं। मैं व्यक्तिगत रूप से सोचता हूं कि आप जो भी अनुमति देंगे उसमें आप प्रतिबंधित हो सकते हैं। मेरे पास मात्रा के लिए एक मुक्त-फार्म फ़ील्ड होगा और भोजन के प्रकार के लिए एक ड्रॉप-डाउन होगा (असल में मैं शायद बहुत सारे के लिए फ्री-फॉर्म की अनुमति दूंगा जब तक कि मैं फ्रिज में मौजूद चीज़ों के आधार पर व्यंजनों की खोज करने की क्षमता नहीं दे रहा था)।

+0

हो सकता है कि हम अलग अलग पारसर्स का उपयोग कर रहे हैं, लेकिन वह इसके बाद के संस्करण मेरी उदाहरण में से किसी से मेल नहीं खाता .. लेकिन मुझे लगता है मैं देख रहा हूँ आप प्रश्न चिह्न के साथ क्या करने की कोशिश कर रहे हैं .. –

+0

@ माइक, मैं जावास्क्रिप्ट आरई इंजन के साथ एयू फ़ैट के रूप में नहीं हूं जैसा कि मैं चाहूंगा लेकिन मुझे उम्मीद थी कि वर्णनात्मक बिट्स इस विचार में हो रहे थे। – paxdiablo

+0

यूप, आपकी अभिव्यक्ति को देखते हुए मुझे लगता है कि इसे भी काम करना चाहिए, लेकिन किसी कारण से यह नहीं है :) मैं चीजों का परीक्षण करने के लिए RegExTester.com का उपयोग कर रहा हूं। –

1

मुझे विश्वास है कि इस regex आप क्या चाहते हैं करना चाहिए:

/^\s*(\d+ \d+\/\d+|\d+\/\d+|\d+)\s*(.*)/ 

विशिष्ट शब्दों से मेल खाते के लिए आप सिर्फ पार्स के बाद खाली स्थान के पर एक विभाजन करना चाहिए। कुछ बात आप regexes से कोई लेना देना नहीं चाहते हैं;)

+0

यूप जो काम करता है, केवल कोई दशमलव समर्थन नहीं .. और मैंने 1/2/कप जैसी चीजों से छुटकारा पाने के लिए (। *) से ([az]। *) बदल दिया .. –

+0

असल में शायद ($ | [az]। *) भी बेहतर है, क्योंकि मैं संख्यात्मक भाग के बाद कुछ भी नहीं चाहता हूं। –

+0

आह हाँ। यदि आप इसके बजाय '[\ d।] +' से दशमलव समर्थन चाहते हैं तो इसका उपयोग किया जाना चाहिए। यदि आप जटिल नियम जोड़ना चाहते हैं तो इसे एक रेगेक्स में पूरी तरह निहित रखना मुश्किल है। – Wolph

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