2009-08-31 16 views
5

के लिए रेगेक्स मैं उपयोगकर्ता इनपुट को सत्यापित करने की कोशिश कर रहा हूं, जो कि अल्पविराम से अलग संख्या है। मैं RegEx के साथ ऐसा करना चाहता हूं, लेकिन सही अभिव्यक्ति के साथ नहीं आ सकता।कॉमा सेपरेटेड नंबर

यह निम्न तार (और बड़े) को मान्य करना चाहिए:

1 
12 
123 
1,234 
12,345 
123,456 

और अमान्य निम्नलिखित तार (और उन्मादपूर्ण):

1,1 
1,12 
12,1 
12,12 
123,1 
123,1 

किसी भी मदद की बहुत सराहना की जाएगी।

यहाँ मैं क्या कोशिश की है अब तक (संपादित करें: जो काम नहीं करते), कई वेरिएंट के साथ ->

^(((\d{1,3},)*\d{3})|(\d{1,3}))$ 
^(\d{1,3}[,])*\d{3}|\d{1,3}$ 

उत्तर

14

इस बारे में कैसे:

^\d{1,3}([,]\d{3})*$ 

मूल रूप से आप कर सकते हैं 1-3 अंक अल्पविराम मुक्त। उसके बाद, आपको एक अल्पविराम की आवश्यकता है। यदि आपके पास अल्पविराम है, तो के बाद 3 और अंक होंगे। वह अल्पविराम-3-अंक अनुक्रम किसी भी समय प्रदर्शित हो सकता है।

संपादित करें: के रूप में एंड्रयू हरे मनाया, तुम क्या तथ्य यह है कि यह मेल खाने वाले तो आप के बजाय आरंभिक कोष्ठक के बाद ?: रखकर एक गैर पर कब्जा समूह का उपयोग कर सकते परे कोष्ठकों के अंदर पाया गया था के बारे में परवाह नहीं है:

^\d{1,3}(?:[,]\d{3})*$ 
+3

+1 अच्छी तरह से किया गया। मेरी एकमात्र आलोचना: चूंकि यह नियमित अभिव्यक्ति केवल सत्यापन के लिए है, इसलिए आपको उस कैप्चर समूह को गैर-कैप्चर समूह के रूप में बदलना चाहिए। –

+2

अच्छा बिंदु, लेकिन यह हमेशा मुझे परेशान करता है कि समूह को गैर-कैप्चर करने से रेगेक्स अधिक बदसूरत हो जाता है। –

+0

मूल रेगेक्स को देखते हुए ऐसा लगता है कि 12,1,123 कानूनी ((\ d {1,3},) * \ d {3}) है जो उपरोक्त –

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