2013-11-22 10 views
5

मैं दशमलव संख्याओं के लिए सही regex खोजने में परेशानी को हल कर रहा हूं जिसमें अल्पविराम विभाजक शामिल हैं।Regex को कम से कम दशमलव संख्या

मैं सामान्य रूप में इस मुद्दे लेकिन जवाब में से कोई भी वास्तव में काम किया जब मैं उन्हें परीक्षण किया के बारे में कुछ अन्य प्रश्न मिला

सबसे अच्छा मैं अब तक मिल गया है:

[0-9]{1,3}(,([0-9]{3}))*(.[0-9]+)? 

2 मुख्य समस्याओं में तो दूर:

1) यह उनके बीच "3001 1" के बीच रिक्त स्थान के साथ संख्याओं को रिकॉर्ड करता है, उन्हें "3001" "1" में विभाजित करने के बजाय - मुझे वास्तव में नहीं लगता कि मैंने रेगेक्स में स्थान को अनुमति दी है।

2) मुझे रेगेक्स की शुरुआत \ समाप्ति के साथ एक सामान्य समस्या है।

रेगुलर एक्सप्रेशन से मेल करना चाहिए:

3,001 
1 
32,012,111.2131 

लेकिन नहीं:

32,012,11.2131 
1132,012,111.2131 
32,0112,111.2131 
32131 

इसके अलावा मैं यह मेल करने के लिए करना चाहते हैं:

1.(without any number after it) 
1,(without any number after it) 
as 1 

(अल्पविराम या पर बिंदु संख्या के अंत को अनदेखा किया जाना चाहिए)।

बहुत धन्यवाद! ।

+0

स्टार्टर्स के लिए, जब तक कि आपकी भाषा की रीगेक्स लाइब्रेरी पहले से ऐसा न करे, आपको शायद दोनों सिरों पर अपने पैटर्न को एंकर करना चाहिए। अन्यथा, इसमें कम से कम एक अंक वाला कोई स्ट्रिंग मेल खाएगा। – cHao

+0

आपने अवधि ('' ''''') के साथ रेगेक्स में रिक्त स्थान की अनुमति दी है, जो कि किसी भी चरित्र से मेल खाता है। केवल अवधि से मेल खाने के लिए अवधि ('' '\ .''') से बचें। – creemama

+0

मुझे नहीं लगता कि दूसरी और तीसरी समस्याएं समस्याएं हैं। जो मैं कह सकता हूं, उससे वे मेल नहीं खाएंगे जो उन्हें नहीं चाहिए। –

उत्तर

2

यह एक बहुत लंबी और शांत नियमित अभिव्यक्ति है जो आपकी सभी आवश्यकताओं को फिट करती है। यह काम करेगा यदि आपका रेगेक्स इंजन पीसीआरई पर आधारित है (उम्मीद है कि आप PHP, डेल्फी या आर का उपयोग कर रहे हैं ..)।

(?<=[^\d,.]|^)\d{1,3}(,(\d{3}))*((?=[,.](\s|$))|(\.\d+)?(?=[^\d,.]|$)) 

DEMO on RegExr

कि यह बहुत देर कर बातें:

  1. एक ही पंक्ति जबकि आंशिक matchs के लिए अनुमति देता है न केवल 1 चरित्र (एक अंतरिक्ष) से ​​अलग पर एक से अधिक नंबर का मिलान एक अग्रदर्शी की आवश्यकता है और एक नजर डालें।
  2. . और , के साथ मेल खाने वाली मिलान संख्या . या , के बिना मैच में एक और लुकहेड की आवश्यकता है।

(?=[,.](\s|$))स्पष्टीकरण

जब यह स्पष्टीकरण लेखन मुझे एहसास हुआ \s जरूरतों एक (\s|$) एक स्ट्रिंग के अंत में 1, मिलान करने के लिए किया जाना है।

regex के इस भाग को 1, में 1 या 1,0001,000. में मिलान तो मान लीजिए कि हमारे संख्या 1,000. है (अंत पर . के साथ) जाने के लिए है।

इस बिंदु regex 1,000 से मेल खाता है अप करने के लिए है, तो यह एक और , हजारों समूह को दोहराने के लिए प्राप्त कर सकते हैं तो यह हमारे (?=[,.](\s|$))

(?=....) एक अग्रदर्शी का मतलब है अपनी, जहां हमारे पास से मतलब है कि पर जाता है मिलान करने के लिए, क्या आ रहा है पर देखो लेकिन मैच में इसे जोड़ें नहीं।

तो यह जाँच करता है अगर वहाँ एक , या एक . और अगर वहाँ है, यह जाँच करता है कि इसे तुरंत खाली स्थान या इनपुट के अंत के बाद है। इस मामले में यह है, इसलिए यह मैच 1,000

था क्योंकि लुकहेड मेल नहीं खाता था, तो यह दशमलव स्थानों से मेल खाने की कोशिश करने के लिए आगे बढ़ता।

+0

अब तक यह बहुत अच्छा काम करता प्रतीत होता है। मैं इसे और अधिक परीक्षण करूंगा। आपका बहुत बहुत धन्यवाद! क्या आप कृपया समझा सकते हैं: (? = [,।] \ S)? – LiranBo

+0

आह महान, मैं जवाब में उस स्पष्टीकरण को जोड़ दूंगा। – OGHaza

+0

उत्तर अपडेट किया गया - मुझे किनारे के मामले की अनुमति देने के लिए रेगेक्स में थोड़ा बदलाव करना पड़ा। – OGHaza

1

यह सभी लोगों को है कि आप

^[0-9]{1,3}(,[0-9]{3})*(([\\.,]{1}[0-9]*)|())$ 
+0

यह कुछ भी नहीं देता है। उपरोक्त उदाहरणों के लिए इसके बिना कुछ उदाहरण देता है जो मेल नहीं खाते थे। – LiranBo

0

. का अर्थ है "किसी भी चरित्र" सूचीबद्ध किया है के लिए काम करता है। एक शाब्दिक . का उपयोग करने के लिए, इसे इस तरह से बचें: \.

जहां तक ​​मुझे पता है, यह एकमात्र चीज गायब है।

+0

उन्होंने ही पंक्ति में कई नंबर मेल करना चाहता है, अपने वर्तमान regex के साथ तो वह अवांछित मैचों के सभी प्रकार के हो जाता है: [डेमो] (http://regexr.com?37asm) – OGHaza

+0

अवांछित क्या मैचों देखते हैं? नीचे की रेखाओं में आंशिक मिलान हैं, लेकिन वे वैध संख्याएं हैं। –

+0

अत्यधिक संभावना नहीं है कि ओपी आदानों वह मेल नहीं खाने वाले के रूप में सूचीबद्ध किया गया है के लिए आंशिक मिलान लेने के लिए होगा। मेरे जैसे Thats सूची '1 -2 -3' में सकारात्मक संख्या के लिए आप पूछ और आप लौटने' "1", "2" और "3" '। निश्चित रूप से वे सकारात्मक संख्याएं हैं जो सूची में होती हैं, लेकिन उन्हें किसी भी उपयोगी संदर्भ से बाहर कर लिया गया है। – OGHaza

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