दशमलव संख्या नियमित अभिव्यक्ति, जहां दशमलव के बाद अंक वैकल्पिक है


112

मुझे एक नियमित अभिव्यक्ति की आवश्यकता है जो एक संख्या को मान्य करता है, लेकिन दशमलव के बाद अंक की आवश्यकता नहीं है। अर्थात।

123
123.
123.4

क्या यह सब मान्य होगा

123..

अमान्य होगा

किसी भी बहुत सराहना की जाएगी!


सबसे अच्छा जवाब यहाँ है: stackoverflow.com/a/39399503/715269
गंगनुस

जवाबों:


190

निम्न का उपयोग करें:

/^\d*\.?\d*$/
  • ^ - लाइन की शुरुआत;
  • \d* - 0 या अधिक अंक;
  • \.?- एक वैकल्पिक डॉट (बच गया, क्योंकि रेगेक्स में, .एक विशेष चरित्र है);
  • \d* - 0 या अधिक अंक (दशमलव भाग);
  • $ - पंक्ति का अंत।

यह 0.5 के रूप में अग्रणी शून्य की आवश्यकता के बजाय .5 दशमलव के लिए अनुमति देता है


2
@ ऑरेंजडॉग, आपके मूल से अधिक मैच वांछित हो सकते हैं। उदाहरण के लिए 'काउ3.45tornado';)
एस। अल्बानो

39
यह एक एकल बिंदु से भी मेल खाता है जो एक मान्य दशमलव संख्या नहीं है। एक बेहतर रेगेक्स होगा /^\d*\.?\d+$/जो दशमलव बिंदु के बाद एक अंक को बाध्य करेगा।
चंद्रवंशी

2
@Chandranshu और यह एक रिक्त स्ट्रिंग से मेल खाता है, जिसे आपका परिवर्तन भी हल करेगा।
ओगहाजा

2
@Chandranshu "को दशमलव के बाद अंक की आवश्यकता नहीं है"
OrangeDog

3
यह समाधान काम नहीं करता है। इसे दशमलव की आवश्यकता होती है जबकि ओपी स्पष्ट रूप से कहता है: वैकल्पिक दशमलव।
एलेक्स जी।

113
/\d+\.?\d*/

एक या अधिक अंक ( \d+), वैकल्पिक अवधि ( \.?), शून्य या अधिक अंक ( \d*)।

आपके उपयोग या रेगेक्स इंजन के आधार पर आपको स्टार्ट / एंड लाइन एंकर जोड़ने की आवश्यकता हो सकती है:

/^\d+\.?\d*$/

नियमित अभिव्यक्ति दृश्य

डीबगेजक्स डेमो


12
हाँ, लेकिन शीर्ष मतदान का उत्तर गलत है, यह .खाली स्ट्रिंग दोनों से मेल खाता है ।
ऑरेंजडॉग

1
@ गैंग्नस नोर का कहना है कि ".digit" का मिलान किया जाना चाहिए। अगर वे ऐसा चाहते थे, तो उन्हें कहना चाहिए था।
ऑरेंजडॉग

2
@EqualityInTech मुझे पूरा यकीन है कि यह नहीं है - इसका कोई समूह नहीं है।
ऑरेंजडॉग

1
हम्म ... मुझे लगता है कि मुझे लगता है कि मैंने सोचा था कि मैं पूरी तरह से बुराई regexes समझ नहीं सकता। माफ़ करना।
JDB अभी भी मोनिका

1
@AlexanderRyanBaggett इस मैच से ठीक उसी तरह मेल खाता है जैसा कि प्रश्न निर्दिष्ट करता है। जैसा कि आप देख सकते हैं कि यह बिल्कुल भी शामिल नहीं है -
ऑरेंजडॉग

74

आपको इसे ठीक से करने के लिए एक नियमित अभिव्यक्ति की आवश्यकता है:

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

व्हाट्सएप के साथ एक ही अभिव्यक्ति, विस्तारित संशोधक का उपयोग करके (पर्ल द्वारा समर्थित):

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

या टिप्पणियों के साथ:

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

उदाहरण के लिए, यह मेल खाएगा:

  • 123
  • 23.45
  • 34।
  • .45
  • -123
  • -273.15
  • -42।
  • -.45
  • 516
  • 9.8
  • 2।
  • +.5

और इन गैर-संख्याओं को अस्वीकार करेगा:

  • । (एकल दशमलव बिंदु)
  • -। (नकारात्मक दशमलव बिंदु)
  • +। (प्लस दशमलव बिंदु)
  • (खाली स्ट्रिंग)

सरल समाधान गलत संख्याओं को अस्वीकार कर सकते हैं या इन गैर-संख्याओं से मेल खा सकते हैं।


1
सर्वश्रेष्ठ इसलिए क्योंकि यह एक अवधि (42.) के बाद की संख्या से मेल खाता है। हालाँकि इसमें एक बग / गलत पॉज़िटिव है क्योंकि यह इस से मेल खाता है: 3 .... 3 जो ^ $ शुरुआत और अंत वर्णों को लागू करने के लिए दो और कोष्ठक जोड़कर तय किया जा सकता है: / ^ ([+ -]? (\ D + (\ _) । (d *);) | ((\। \ d +)) $ /
पीट एल्विन

1
धन्यवाद पीट, अच्छी तरह से देखा। उत्तर को अब सही कर दिया गया है, अतिरिक्त कोष्ठक जोड़कर ताकि वह जैसा चाहे वैसा व्यवहार करे। यह अब जैसा लिखा जाता है ^A?(B|C)$। पहले, यह लिखा गया था जैसे ^A?B|C$कि वास्तव में इसका मतलब है (^A?B)|(C$)जो गलत था। नोट: ^(A?B|C)$यह भी गलत है, क्योंकि इसका वास्तव में मतलब है ^((A?B)|(C))$जो "+.5" से मेल नहीं खाता।
होयलेन

2
यह सबसे अच्छा जवाब है। अन्य उत्तर सभी मामलों को संभालते नहीं हैं। मैं खुद भी ऐसा ही करता हूं, सिवाय इसके कि मैं गुम-अंकों के मामलों को संभालने के लिए एक लुकहेड का उपयोग करता हूं: / ^ [ /
फिलहार्वे

1
यह यहाँ एकमात्र सही रेगेक्स है। लेकिन कुछ लोग "34." से असहमत होंगे। मैं * + के बजाय + डी के बाद + प्रपोज करेगा
गंगनुस

1
यह 0000.2 से भी मेल खाता है, जो कि वांछित नहीं है।
एरॉन ज़ोरल

11

इस regex का प्रयास करें:

\d+\.?\d*

वैकल्पिक दशमलव से पहले \ d + अंक
।? वैकल्पिक दशमलव (वैकल्पिक मात्रा के कारण)
\ d * दशमलव के बाद वैकल्पिक अंक


1
नहीं, यह है कि एक से मेल नहीं खाता123.
बार्ट Kiers

1
नोट के लिए धन्यवाद। मेरे रेगेक्स को संशोधित किया।
काश

4
वास्तव में, लेकिन अब आपने इसे पहले से ही किसी और के द्वारा पोस्ट किया गया है। सिर्फ एक और "सही" उत्तर को हटाने पर विचार करें।
बार्ट Kiers

10

मुझे लगता है कि यह सबसे अच्छा है क्योंकि यह सभी आवश्यकताओं से मेल खाता है:

^\d+(\\.\d+)?$

1
मेरे लिए यह सबसे अच्छा जवाब है, क्योंकि स्ट्रिंग: "4." (उदाहरण के लिए) कम से कम माणिक भाषा में मान्य संख्या नहीं है। हालांकि, सबसे अधिक उत्तोलित उत्तर "4." स्वीकार करता है नंबर रेगेक्स के रूप में, जो गलत है।
विक्टर

3

मैंने निम्नलिखित का उपयोग करके समाप्त किया:

^\d*\.?\d+$

यह निम्नलिखित को अमान्य बनाता है:

.
3.

आपको जिस भाषा का उपयोग कर रहे हैं, उसके आधार पर आपको स्लैश की आवश्यकता हो सकती है। उदाहरण के लिए: /^\d*\.?\d+$/
चार्ल्स

यह अनुमति देगा.3
रॉय नामी



2

यह जो मैंने किया है। यह उपरोक्त में से किसी से भी अधिक सख्त है (और कुछ की तुलना में अधिक सही है):

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

गुजरने वाले तार:

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

स्ट्रिंग्स जो विफल हो जाती है:

.
00000
01
.0.
..
00.123
02.134

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

प्रतिबिंबित करना चाहिए कि लोग आमतौर पर एक अच्छी तरह से गठित दशमलव संख्या के रूप में क्या सोचते हैं।

दशमलव बिंदु से पहले के अंक या तो एकल अंक हो सकते हैं, जिस स्थिति में यह 0 से 9 तक हो सकता है, या एक से अधिक अंक हो सकता है, जिस स्थिति में यह 0 से शुरू नहीं हो सकता है।

यदि दशमलव चिह्न से पहले कोई अंक मौजूद हैं, तो दशमलव और उसके बाद के अंक वैकल्पिक हैं। अन्यथा, एक दशमलव को कम से कम एक अंक के साथ उपस्थित होना होगा। ध्यान दें कि दशमलव बिंदु के बाद कई अनुगामी 0 की अनुमति है।

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

सही ढंग से निम्नलिखित से मेल खाता है:

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

साथ ही उनके हस्ताक्षरित समकक्ष, जबकि यह निम्नलिखित को अस्वीकार करता है:

.
00
01
00.0
01.3

और उनके हस्ताक्षरित समकक्ष, साथ ही खाली स्ट्रिंग।


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

साफ और सरल।

यह प्रत्यय और उपसर्ग, RegEx सुविधाओं का उपयोग करता है।

यह सीधे इस्मैच की स्थिति के लिए सही - गलत है


1
^\d+(()|(\.\d+)?)$

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


1

आपने जो पूछा है उसका पहले ही उत्तर दिया जा चुका है, इसलिए यह केवल उन लोगों के लिए एक अतिरिक्त जानकारी है जो वैकल्पिक दशमलव बिंदु में प्रवेश करने पर केवल 2 दशमलव अंक चाहते हैं:

^\d+(\.\d{2})?$

^: स्ट्रिंग
\ d की शुरुआत : एक अंक ([0-9] के बराबर)
+: एक और असीमित बार

समूह कैप्चरिंग (। \ D {2})?
? : शून्य और एक बार। : चरित्र।
\ d: एक अंक ([0-9] के बराबर)
{2}: ठीक 2 बार
$: स्ट्रिंग का अंत

1: मैच
123: मैच
123.00: मैच
123.: नो मैच
123 ..: नो मैच
123.0: नो मैच
123.000: नो मैच
123.00.00: नो मैच


क्या यह नकारात्मक संख्याओं से मेल खाता है?
अलेक्जेंडर रयान बैजट

1
@AlexanderRyanBaggett आपको नकारात्मक चिन्ह की जाँच करने की आवश्यकता है इसलिए यह होगा: ^ -? \? + + ((\। \ D {2})? $
PersyJack

0

Perl में, Regexp :: Common का उपयोग करें जो आपको अपने विशेष नंबर प्रारूप के लिए एक बारीक-ट्यून नियमित अभिव्यक्ति को इकट्ठा करने की अनुमति देगा। यदि आप पर्ल का उपयोग नहीं कर रहे हैं, तो उत्पन्न नियमित अभिव्यक्ति अभी भी आमतौर पर अन्य भाषाओं द्वारा उपयोग की जा सकती है।

Regexp में उदाहरण नियमित अभिव्यक्ति उत्पन्न करने का परिणाम मुद्रण :: सामान्य :: संख्या:

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.