केवल संख्या के लिए Regex


309

मैंने नियमित अभिव्यक्ति का उपयोग नहीं किया है, इसलिए मुझे समस्या निवारण में कठिनाई हो रही है। मैं चाहता हूं कि रेगेक्स केवल तभी मेल खाए जब निहित स्ट्रिंग सभी संख्याएं हों; लेकिन नीचे दिए गए दो उदाहरणों के साथ यह एक स्ट्रिंग का मिलान कर रहा है जिसमें सभी संख्याएँ हैं जैसे "1234 = 4321" के बराबर चिह्न। मुझे यकीन है कि इस व्यवहार को बदलने का एक तरीका है, लेकिन जैसा कि मैंने कहा, मैंने वास्तव में नियमित अभिव्यक्तियों के साथ बहुत कुछ नहीं किया है।

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

यदि यह मायने रखता है, तो मैं C # और .NET2.0 का उपयोग कर रहा हूं।


6
क्या आपको संख्या या अंकों का मिलान करने की आवश्यकता है ? उदाहरण के लिए: 123.456 एक संख्या है, लेकिन यह सभी अंक नहीं है।
जोएल कोएहॉर्न 18

वास्तव में, पूर्णांक का उपयोग करने के बारे में ओपी पूरी तरह से स्पष्ट नहीं है या नहीं
सून रिवर्स

3
उस साधारण मामले के लिए क्यों नहीं की कोशिश करो? bool decimal.TryParse (स्ट्रिंग स्ट्रिंग, बाहर दशमलव परिणाम) या bool int.TryParse (स्ट्रिंग स्ट्रिंग, बाहर पूर्णांक परिणाम)
Makach

देखो इस जवाब नियमित अभिव्यक्ति के साथ संख्या पार्स करने का एक निश्चित इलाज के लिए।
14

1
सामान्य तौर पर, रेगेक्स के भावों का निवारण करने का सबसे आसान तरीका, मेरी राय में, कमांड लाइन दुभाषिया का उपयोग करके है, अगर आपकी भाषा इसे अनुमति देती है (ऐसा लगता है कि सबसे अधिक)। चूँकि यह उदाहरण C # में है, आप linqpad.net का उपयोग कर सकते हैं , या आप डीबगर में एक ब्रेकपॉइंट का उपयोग कर सकते हैं और फिर VS में एक CLI के रूप में तत्काल विंडो का उपयोग कर सकते हैं।
एंड्रयू

जवाबों:


478

शुरुआत और अंत एंकर का उपयोग करें।

Regex regex = new Regex(@"^\d$");

"^\d+$"यदि आपको एक से अधिक अंकों का मिलान करने की आवश्यकता हो तो उपयोग करें ।


ध्यान दें कि "\d"मैच [0-9]और अन्य अंकों के अक्षर जैसे पूर्वी अरबी अंक ٠١٢٣٤٥٦٧٨٩"^[0-9]+$"मैचों को केवल अरबी अंकों 0 - 9 तक सीमित रखने के लिए उपयोग करें ।


यदि आपको केवल अंकों के अलावा किसी भी संख्यात्मक निरूपण को शामिल करने की आवश्यकता है (जैसे शुरुआत के लिए दशमलव मान), तो नियमित अभिव्यक्तियों के साथ अंकों की पार्सिंग के लिए @tchrist के व्यापक गाइड को देखें


संख्यात्मक मानों की एक निर्धारित संख्या के बारे में कैसे? ऐसा आमतौर पर भारत जैसे कुछ देशों के पोस्टल कोड के लिए होता है। मुझे लगता है कि हमें इसके बाद एक स्ट्रिंग लंबाई की जाँच करनी पड़ सकती है?
नजीब

2
@ नजीब हां, चूंकि भारतीय ज़िप कोड 6 अंकों की संख्या है, आप कुछ का उपयोग कर सकते हैं "^\d{6}$"। कुछ अन्य देशों में ज़िप कोड के लिए अधिक जटिल नियम हैं, इसलिए कई देशों के लिए रेगेक्स समाधान बहुत जटिल हो सकते हैं। कुछ उदाहरण देखें stackoverflow.com/q/578406/1288 पर
बिल द छिपकली

यदि इनपुट स्ट्रिंग कुछ ऐसी है तो कैसे आए: "3 a" यह अभी भी मेल खाएगा? क्या किसी को पता है कि मैं इसे केवल मिलान करने के लिए कैसे प्राप्त कर सकता हूं यदि संख्याएं हैं, और कुछ और नहीं (एक नकारात्मक संकेत को छोड़कर जो मुझे लगता है)। वर्तमान में मैंने इसे इस तरह सेट किया है "-? [0-9] +"।
मैथ्यू

105

आपका regex ऐसी किसी भी चीज़ से मेल खाएगा जिसमें एक नंबर होता है, आप पूरे स्ट्रिंग से मिलान करने के लिए एंकर का उपयोग करना चाहते हैं और फिर एक या अधिक संख्याओं का मिलान कर सकते हैं:

regex = new Regex("^[0-9]+$");

^लंगर होगा स्ट्रिंग की शुरुआत, $स्ट्रिंग के अंत लंगर होगा, और +एक या एक से मेल खाएगा इससे पहले आने वाली (इस मामले में एक नंबर) के और अधिक।


38

यदि आपको दशमलव बिंदु और हजार मार्कर को सहन करने की आवश्यकता है

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

आपको "-" की आवश्यकता होगी, यदि संख्या नकारात्मक जा सकती है।


@ फूलिन गीता धन्यवाद। "-" शुरुआत में होना चाहिए।
एंडी

3
यह रेगेक्स भी एक से अधिक बार होने के लिए प्रमुख नकारात्मक संकेत ( -) और अवधि ( .) की अनुमति देता है।
डेविड आरआर

5
आप बना सकते हैं -और .वैकल्पिक कर सकते हैं ?-?\d+(?:\.\d+)?पूर्णांकों या दशमलवों का मिलान करेगा। ( ?:
Parens में सिर्फ Parens को

2
यह 1, .5 जैसे किनारे के मामलों के लिए विफल रहता है, लेकिन यदि आप इसकी देखरेख करते हैं। अभी भी यह -2 जैसे बुनियादी मामलों के लिए विफल है। ^-?[0-9][0-9,\.]*$मूल मामले के लिए असफल होने से बचने के लिए कृपया इसे बदल दें । + को *
PrivateOmega

एक दृश्य जो मुझे याद आ रहा है वह है इंजीनियरिंग नोटेशन (1.2345e-4) इसके बारे में कोई सुझाव?
वोल्फगि

18

यह मेल खा रहा है क्योंकि यह "एक मैच" ढूंढ रहा है पूर्ण स्ट्रिंग का मैच नहीं। आप विशेष रूप से स्ट्रिंग की शुरुआत और अंत के लिए अपने regexp को बदलकर इसे ठीक कर सकते हैं।

^\d+$

16

शायद मेरी विधि आपकी मदद करेगी।

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
हालांकि यह ध्यान रखें कि किसी भी वर्ण के लिए Char.IsDigitरिटर्न trueजो UnicodeCategory.DecimalDigitNumber का सदस्य है श्रेणी । यह वह नहीं हो सकता जो ओपी चाहता है। यह भी देखें कि क्यों Char.IsDigit चार के लिए सच है जो int करने के लिए पार्स नहीं किया जा सकता है?
डेविड आरआर 9/14


16

यह पूर्णांक और दशमलव संख्याओं के साथ काम करता है। यदि संख्या कोमा हजार विभाजक है तो यह मेल नहीं खाता,

"^-?\\d*(\\.\\d+)?$"

इसके साथ मेल खाने वाले कुछ तार:

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

कुछ तार जो नहीं है:

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.


10

यदि आपको यह जांचने की आवश्यकता है कि सभी अंक संख्या (0-9) हैं या नहीं,

^[0-9]+$

1425 TRUE

0142 TRUE

0 सच

1 TRUE

154a25 FALSE

1234 = 3254 FALSE


10

यहाँ मेरा काम कर रहा है:

^(-?[1-9]+\\d*([.]\\d+)?)$|^(-?0[.]\\d*[1-9]+)$|^0$

और कुछ परीक्षण

सकारात्मक परीक्षण:

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

नकारात्मक परीक्षण:

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

न केवल C # के लिए, बल्कि Java, Javascript और PHP के साथ भी जाँच की गई


".3", "3।" वास्तव में अच्छी संख्याएं हैं (क्रमशः 0.3 और 3.0 अर्थ)। हम इसे हर समय स्रोत प्रणालियों में देखते हैं, और आपके द्वारा बताई गई भाषाओं के अधिकांश tonnumber (xx) फ़ंक्शन सही रूप से पहचान और परिवर्तित होंगे। धन्यवाद।
तगार

1
@Ruslan आप सही हैं कि कई प्रणालियों में ".3", "3।" मान्य संख्या के बराबर होगा और जैसा कि आपने "0.3" और "3.0" का उल्लेख किया है। लेकिन दूसरे हाथ में - कि परिवर्तित मूल्य है, इसलिए मूल मूल्य ".3" और "3." वास्तव में मौजूदा संख्या नहीं है।
मरीना के।

9

बदसूरत स्वरूपण के लिए क्षमा करें। किसी भी अंक के लिए:

[0-9]*

एक या अधिक अंकों के लिए:

[0-9]+

7

जबकि उपरोक्त समाधानों में से कोई भी मेरे उद्देश्य को पूरा नहीं कर रहा था, इसने मेरे लिए काम किया।

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

मान्य मूल्यों का उदाहरण: "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

मान्य मानों का उदाहरण: "a", "", "", "-", "-", "001", "00.2", "000.5", ".3", "3.", "-1"। , "- 1", "-.1", "-0", "00099", "099"


4

एक और तरीका: यदि आप फ़ारसी या अरबी जैसे अंतर्राष्ट्रीय नंबरों से मेल खाना चाहते हैं, तो आप निम्न अभिव्यक्ति का उपयोग कर सकते हैं:

Regex = new Regex(@"^[\p{N}]+$");

शाब्दिक अवधि वर्ण उपयोग से मेल खाने के लिए:

Regex = new Regex(@"^[\p{N}\.]+$");


3

पूर्णांक और फ्लोटिंग पॉइंट नंबरों के लिए Regex:

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

एक संख्या एक अवधि (अग्रणी अंकों के बिना) के साथ शुरू हो सकती है, और एक संख्या एक अवधि (अनुगामी अंकों (एस) के बिना) के साथ समाप्त हो सकती है। ऊपर रेगेक्स दोनों को सही संख्या के रूप में मान्यता देगा।

ए । (अवधि) बिना किसी अंक के अपने आप में एक सही संख्या नहीं है। इसलिए हमें वहां दो regex भागों की आवश्यकता है (एक "|" के साथ अलग)।

उम्मीद है की यह मदद करेगा।


1
यह सबसे पूर्ण समाधान है। बधाई!
रेनैटो मेदिरोस

2

मुझे लगता है कि यह सबसे सरल है और यह संख्या लिखने के यूरोपीय और संयुक्त राज्य अमेरिका के तरीके को स्वीकार करता है जैसे यूएसए 10,555.12 यूरोपीय 10.555,12 यह भी एक दूसरे के बाद कई कॉमा या डॉट्स की अनुमति नहीं देता है जैसे 10..22 या 10, 22। इस तरह की संख्या के अलावा .55 या, 55 पास होगा। यह काम हो सकता है।

^([,|.]?[0-9])+$


-4

रेगेक्स रेगेक्स = नया रेगेक्स ("^ [0-9] {1,4} = [0-9] {1,4] $")


5
क्या आप अपना जवाब थोड़ा सा समझा सकते हैं? आप देखेंगे कि इस प्रश्न के अन्य उत्तरों में कुछ स्तर की व्याख्या है कि रेगेक्स का प्रत्येक भाग क्या करता है, जिसकी आपको कमी है।
वाई हा ली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.