फ्लोटिंग पॉइंट नंबरों के लिए नियमित अभिव्यक्ति


115

मेरा फ़्लोटिंग पॉइंट नंबरों से मिलान करने का कार्य है। मैंने इसके लिए निम्नलिखित नियमित अभिव्यक्ति लिखी है:

[-+]?[0-9]*\.?[0-9]*

लेकिन, यह एक त्रुटि देता है:

Invalid escape sequence (valid ones are  \b  \t  \n  \f  \r  \"  \'  \\ )

मेरे ज्ञान के अनुसार, हमें भागने के पात्र का .भी उपयोग करना होगा। कृपया मुझे सही करें जहां मैं गलत हूं।


10
इस रेगेक्स का उपयोग किस भाषा में किया जाता है?
कैफ़ीक सेप

3
@JDB - आप एक नंबर / फ्लोट रेगेक्स के लिए 100 अंक क्यों दे रहे हैं? मानक हमेशा (?:\d+(?:\.\d*)?|\.\d+)एसओ पर विज्ञापन infinitum रहा है ...


1
[-+]?([0-9]*[.])?[0-9]+([eE][-+]?\d+)?यदि आप घातीय संकेतन भी पकड़ना चाहते हैं, तो, जी, 3.023e-23
wcochran

जावा या C ++ जैसी कुछ भाषाओं में, बैकस्लैश से बच जाना चाहिए। तो regex "\" पाने के लिए, आप स्ट्रिंग "\\" का उपयोग करेंगे। कच्चे तार का उपयोग करके अजगर इसके चारों ओर हो जाता है।
HackerBoss

जवाबों:


258

टी एल; डॉ

का प्रयोग करें [.]के बजाय \.और [0-9]के बजाय \dकुछ भाषाओं (जावा की तरह) में मुद्दों से बचने से बचने के लिए।

मूल रूप से इसे पहचानने के लिए नाममात्र के लिए धन्यवाद ।

फ्लोटिंग पॉइंट संख्या के मिलान के लिए एक अपेक्षाकृत सरल पैटर्न है

[+-]?([0-9]*[.])?[0-9]+

यह मैच होगा:

  • 123
  • 123.456
  • .456

एक कार्यशील उदाहरण देखें

यदि आप भी मेल करना चाहते हैं 123.(कोई दशमलव भाग नहीं है), तो आपको थोड़ी लंबी अभिव्यक्ति की आवश्यकता होगी:

[+-]?([0-9]+([.][0-9]*)?|[.][0-9]+)

इस पैटर्न की एक पूरी व्याख्या के लिए pkeller का उत्तर देखें

यदि आप गैर-दशमलव संख्याओं, जैसे हेक्स और ऑक्टल को शामिल करना चाहते हैं, तो मेरा उत्तर देखें कि मैं कैसे पहचानूं कि एक स्ट्रिंग एक संख्या है?

आप चाहते हैं को मान्य है कि एक इनपुट एक नंबर (बजाय इनपुट के अंतर्गत एक नंबर पाने के) है, तो आप के साथ पैटर्न के चारों ओर जाना चाहिए ^और $, इसलिए की तरह:

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

अनियमित नियमित अभिव्यक्तियाँ

"नियमित अभिव्यक्ति", जैसा कि अधिकांश आधुनिक भाषाओं में लागू किया गया है, एपीआई, फ्रेमवर्क, लाइब्रेरी आदि, औपचारिक भाषा सिद्धांत में विकसित अवधारणा पर आधारित हैं । हालाँकि, सॉफ्टवेयर इंजीनियरों ने कई विस्तार जोड़े हैं जो औपचारिक परिभाषा से परे इन कार्यान्वयनों को लेते हैं। इसलिए, जबकि अधिकांश नियमित अभिव्यक्ति इंजन एक दूसरे से मिलते-जुलते हैं, वास्तव में कोई मानक नहीं है। इस कारण से, बहुत कुछ इस बात पर निर्भर करता है कि आप किस भाषा, एपीआई, रूपरेखा या पुस्तकालय का उपयोग कर रहे हैं।

(संयोग से, भ्रम को कम करने में मदद करने के लिए, कई लोगों ने इन संवर्धित मिलान भाषाओं का वर्णन करने के लिए " regex " या " regexp " का उपयोग किया है। अधिक जानकारी के लिए RexEgg.com पर Regex को एक नियमित अभिव्यक्ति के रूप में देखें ? )

उस ने कहा, अधिकांश रेगेक्स इंजन (वास्तव में, उनमें से सभी, जहां तक ​​मुझे पता है) स्वीकार करेंगे \.। सबसे अधिक संभावना है, भागने के साथ एक मुद्दा है।

भागने के साथ परेशानी

कुछ भाषाओं में जावास्क्रिप्ट के लिए अंतर्निहित समर्थन है, जैसे कि जावास्क्रिप्ट । उन भाषाओं के लिए, जिनसे बचना एक समस्या हो सकती है।

ऐसा इसलिए है क्योंकि आप मूल रूप से एक भाषा के भीतर एक भाषा में कोडिंग कर रहे हैं। उदाहरण के लिए, जावा \इसके तार के भीतर भागने के पात्र के रूप में उपयोग करता है , इसलिए यदि आप एक स्ट्रिंग के भीतर एक शाब्दिक बैकलैश चरित्र रखना चाहते हैं, तो आपको इससे बचना चाहिए:

// creates a single character string: "\"
String x = "\\";

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

// Creates a two-character string: "\\"
// When used as a regex pattern, will match a single character: "\"
String regexPattern = "\\\\";

आपके मामले में, आप शायद उस भाषा से पीछे नहीं हटेंगे जिस भाषा में आप प्रोग्रामिंग कर रहे हैं:

// will most likely result in an "Illegal escape character" error
String wrongPattern = "\.";
// will result in the string "\."
String correctPattern = "\\.";

यह सब भागने से बहुत भ्रम हो सकता है। यदि आप जिस भाषा के साथ काम कर रहे हैं वह कच्चे तार का समर्थन करती है , तो आपको बैकस्लैश की संख्या में कटौती करने के लिए उन का उपयोग करना चाहिए, लेकिन सभी भाषाएं नहीं करती हैं (सबसे विशेष रूप से: जावा)। सौभाग्य से, वहाँ एक विकल्प है जो समय के कुछ काम करेगा:

String correctPattern = "[.]";

रेगेक्स इंजन के लिए, \.और [.]इसका मतलब बिल्कुल वही है। ध्यान दें कि यह हर मामले में काम नहीं करता है, जैसे कि newline ( \\n), खुला वर्ग ब्रैकेट ( \\[) और बैकस्लैश ( \\\\या [\\])।

मिलान संख्या के बारे में एक नोट

(संकेत: आपके विचार से यह कठिन है)

एक संख्या का मिलान उन चीजों में से एक है जो आपको लगता है कि रेगेक्स के साथ काफी आसान है, लेकिन यह वास्तव में बहुत मुश्किल है। आइए आपके दृष्टिकोण पर एक नज़र डालते हैं, टुकड़ा-टुकड़ा:

[-+]?

एक वैकल्पिक मैच -या+

[0-9]*

मैच 0 या अधिक अनुक्रमिक अंक

\.?

एक वैकल्पिक मैच .

[0-9]*

मैच 0 या अधिक अनुक्रमिक अंक

सबसे पहले, हम इस अभिव्यक्ति को अंकों के लिए एक चरित्र वर्ग आशुलिपि का उपयोग करके थोड़ा साफ कर सकते हैं (ध्यान दें कि यह ऊपर उल्लिखित पलायन मुद्दे के लिए भी अतिसंवेदनशील है):

[0-9] = \d

मैं \dनीचे उपयोग करने जा रहा हूं , लेकिन ध्यान रखें कि इसका मतलब उसी के समान है [0-9]। (ठीक है, वास्तव में, कुछ इंजनों में \dसभी लिपियों से अंकों का मिलान होगा, इसलिए यह [0-9]इच्छा से अधिक मेल खाएगा , लेकिन यह संभवतः आपके मामले में नहीं है।)

अब, यदि आप इसे ध्यान से देखते हैं, तो आपको महसूस होगा कि आपके पैटर्न का हर एक हिस्सा वैकल्पिक है । यह पैटर्न 0-लंबाई के स्ट्रिंग से मेल खा सकता है; केवल +या से बना एक स्ट्रिंग -; या, एक स्ट्रिंग केवल एक की रचना की .। यह शायद वह नहीं है जो आपने इरादा किया है।

इसे ठीक करने के लिए, नंगे-न्यूनतम आवश्यक स्ट्रिंग के साथ अपने रेगेक्स को "एंकरिंग" से शुरू करना उपयोगी है, शायद एक अंक:

\d+

अब हम दशमलव भाग को जोड़ना चाहते हैं, लेकिन यह नहीं है कि आपको लगता है कि यह कहाँ हो सकता है:

\d+\.?\d* /* This isn't quite correct. */

यह अभी भी जैसे मूल्यों से मेल खाएगा 123.। इससे भी बुरी बात यह है कि इसके बारे में बुराई है। यह अवधि वैकल्पिक है, जिसका अर्थ है कि आपने दो दोहराया वर्गों को साथ-साथ ( \d+और \d*) प्राप्त किया है। यह वास्तव में खतरनाक हो सकता है यदि केवल गलत तरीके से उपयोग किया जाता है, तो अपने सिस्टम को DoS हमलों तक खोलना।

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

\d+(\.\d+)? /* Better. But... */

यह अब बेहतर दिख रहा है। हमें अंकों के पहले अनुक्रम और दूसरे के बीच की अवधि की आवश्यकता होती है, लेकिन एक घातक दोष है: हम मेल नहीं खा सकते .123क्योंकि एक अग्रणी अंक की अब आवश्यकता है।

यह वास्तव में तय करने के लिए बहुत आसान है। संख्या के "दशमलव" भाग को वैकल्पिक बनाने के बजाय, हमें इसे वर्णों के अनुक्रम के रूप में देखने की आवश्यकता है: 1 या अधिक संख्याएँ जो कि उपसर्ग से .हो सकती हैं जो कि 0 या उससे अधिक संख्या से उपसर्ग हो सकती हैं:

(\d*\.)?\d+

अब हम सिर्फ संकेत जोड़ते हैं:

[+-]?(\d*\.)?\d+

बेशक, उन स्लैश जावा में बहुत कष्टप्रद हैं, इसलिए हम अपने लंबे-चरित्र चरित्र वर्गों में स्थानापन्न कर सकते हैं:

[+-]?([0-9]*[.])?[0-9]+

मिलान बनाम सत्यापन

यह एक दो बार टिप्पणियों में सामने आया है, इसलिए मैं मिलान बनाम सत्यापन पर एक परिशिष्ट जोड़ रहा हूं।

मिलान का लक्ष्य इनपुट के भीतर कुछ सामग्री ढूंढना है ("हैस्टैक में सुई")। मान्य करने का लक्ष्य यह सुनिश्चित करना है कि इनपुट एक अपेक्षित प्रारूप में है।

Regexes, उनके स्वभाव से, केवल पाठ से मेल खाते हैं। कुछ इनपुट को देखते हुए, वे या तो कुछ मिलान पाठ पाएंगे या वे नहीं करेंगे। हालांकि, एंकर टैग ( ^और $) के साथ इनपुट की शुरुआत और समाप्ति के लिए एक अभिव्यक्ति "स्नैपिंग" करके , हम यह सुनिश्चित कर सकते हैं कि कोई भी मिलान तब तक नहीं मिलता है जब तक कि संपूर्ण इनपुट अभिव्यक्ति से मेल नहीं खाता हो, प्रभावी रूप से मान्य करने के लिए रीगेक्स का उपयोग करके ।

ऊपर वर्णित रेगेक्स ( [+-]?([0-9]*[.])?[0-9]+) एक लक्ष्य स्ट्रिंग के भीतर एक या अधिक संख्याओं से मेल खाएगा । इसलिए इनपुट दिया गया:

apple 1.34 pear 7.98 version 1.2.3.4

रेगुलर एक्सप्रेशन से मेल होगा 1.34, 7.98, 1.2, .3और .4

यह सत्यापित करने के लिए कि एक दिया गया इनपुट एक संख्या है और एक संख्या के अलावा और कुछ नहीं है, लेकिन एंकर टैग में इसे लपेटकर इनपुट के शुरू और अंत में अभिव्यक्ति को "स्नैप" करें:

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

यह केवल तभी एक मैच खोजेगा जब पूरा इनपुट एक फ्लोटिंग पॉइंट नंबर हो, और अगर इनपुट में अतिरिक्त वर्ण हों तो मैच नहीं मिलेगा। तो, इनपुट को देखते हुए 1.2, एक मैच मिल जाएगा, लेकिन दिए गए apple 1.2 pearमैच नहीं मिलेंगे।

ध्यान दें कि कुछ regex इंजन एक है validate, isMatchया इसी तरह के समारोह है, जो अनिवार्य क्या मैं अपने आप का वर्णन किया है, लौटने करता है trueयदि कोई मिलान पाया जाता है और falseअगर कोई मुकाबला नहीं पाया जाता है। यह भी ध्यान रखें कि कुछ इंजन सेट झंडे जो की परिभाषा को बदलने के लिए आप की अनुमति देते हैं ^और $, शुरुआत / बजाय पूरे इनपुट की शुरुआत / अंत एक पंक्ति के अंत से मेल खाते। यह आमतौर पर डिफ़ॉल्ट नहीं है, लेकिन इन झंडों की तलाश में हैं।


2
JDB, धन्यवाद और मुझे आशा है कि आप अभी भी आसपास हैं! मैं भविष्य में आपकी पोस्ट पढ़ रहा हूं :) आपका जवाब निश्चित रूप से 0.24 और 2.2 का ख्याल रखता है और 4.2.44 को सही ढंग से नापसंद करता है। सभी regex101.com के साथ परीक्षण किया गया है। हालांकि, यह 123 को अस्वीकार कर देता है। जैसा कि आप कहते हैं कि स्वीकार्य हो सकता है (और मुझे लगता है कि यह है) है!)। मैं आपकी अभिव्यक्ति को [- +]? (\ D * [।]) में बदलकर इसे ठीक कर सकता हूं? \ D * (नोटिस * के बजाय अंत में) + लेकिन फिर पागल जैसी चीजें। (आपका दूसरा उदाहरण) की अनुमति है। वैसे भी मेरे केक है और यह भी खाने के लिए?
डेव

2
@ देवे -\d+(\.\d*)?|\.\d+
JDB अब भी

/[-+]?(\d*[.])?\d+/.test("1.bc") // returns true
यौऊ

1
@yeouuu हाँ, क्योंकि 1.मैच। जोड़ें ^और $शुरुआत करने के लिए और regex के अंत में आप केवल पूरे इनपुट मैचों यदि मिलान करना चाहते हैं।
JDB अब भी

5
फ्लोट्स में एक्सपोर्टर हो सकते हैं या NaN / Inf हो सकते हैं, इसलिए मैं इसका उपयोग करूंगा: [-+]?(([0-9]*[.]?[0-9]+([ed][-+]?[0-9]+)?)|(inf)|(nan))फ्लोट / डबल प्रिसिजन फ्लोट के लिए e / d। Regex के लिए एक गुना मामले के झंडे को मत भूलना
मार्कस श्मस्समैन

23

मुझे नहीं लगता कि लेखन के समय इस पृष्ठ पर कोई भी उत्तर सही है (एसओ पर अन्य कई सुझाव भी गलत हैं)। जटिलता यह है कि आपको निम्नलिखित सभी संभावनाओं से मेल खाना है:

  • कोई दशमलव बिंदु (यानी पूर्णांक मान)
  • दशमलव बिंदु से पहले और बाद के दोनों अंक (जैसे 0.35, 22.165)
  • दशमलव बिंदु से पहले अंक (जैसे 0., 1234.)
  • दशमलव बिंदु के बाद अंक (जैसे .0, .5678)

उसी समय, आपको यह सुनिश्चित करना चाहिए कि कहीं कम से कम एक अंक है, अर्थात निम्नलिखित की अनुमति नहीं है:

  • अपने आप एक दशमलव बिंदु
  • कोई अंक (यानी +.या -.) के साथ एक हस्ताक्षरित दशमलव बिंदु
  • +या -अपने दम पर
  • एक खाली तार

यह पहली बार में मुश्किल लग रहा है, लेकिन प्रेरणा पाने का एक तरीका है OpenJDK स्रोत को java.lang.Double.valueOf(String)विधि के लिए देखना ( http://hg.openjdk.java.net/jdk8/jdk8/jdk पर शुरू , "ब्राउज़ करें" पर क्लिक करें, नीचे नेविगेट करें /src/share/classes/java/lang/और Doubleवर्ग खोजें)। लंबे समय तक रेगेक्स कि इस वर्ग में विभिन्न संभावनाएं हैं जो ओपी के दिमाग में नहीं है, लेकिन सरलता के लिए इसे अनदेखा कर रहे हैं, जो कि NaN, इन्फिनिटी, हेक्साडेसिमल नोटेशन और एक्सपोर्टर के साथ काम करते हैं और \dPOSIX नोटेशन के बजाय इसका उपयोग करते हैं। एकल अंक, मैं बिना किसी प्रतिपादक के साथ हस्ताक्षरित फ्लोटिंग पॉइंट संख्या के लिए रेगेक्स के महत्वपूर्ण हिस्सों को कम कर सकता हूं:

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

मुझे नहीं लगता कि (...)|(...)बिना किसी अंक की अनुमति के निर्माण से बचने का एक तरीका है, जिसमें कोई भी अंक नहीं है, या उन संभावनाओं में से एक को मना करना जिनके पास दशमलव बिंदु से पहले कोई अंक नहीं है या इसके बाद कोई अंक नहीं है।

जाहिर तौर पर व्यवहार में आपको व्हाट्सएप या उससे पहले आने वाले व्हाट्सएप को पूरा करने की आवश्यकता होगी, या तो स्वयं रेक्सक्स में या उस कोड में जो इसका उपयोग करता है।


यदि आप संख्याओं की तरह मिलान करने की आवश्यकता जोड़ते हैं 123., तो हाँ ... या स्विच एकमात्र समाधान है, जैसा कि मैंने अपने मूल पोस्ट पर एक टिप्पणी में बताया है ।
JDB

1
यह, और सभी / अधिकांश अन्य उत्तर, ध्यान दें कि एक फ्लोट में एक घातांक हो सकता है।
नैट्स

1
@ नेट्स यह सही है, मैंने लिखा था "सरलता के लिए इसे अनदेखा करना जो कि NaN, इन्फिनिटी, हेक्साडेसिमल संकेतन और प्रतिपादक से निपटते हैं", क्योंकि यह ओपी के प्रश्न के दायरे से मेल खाता है। JDK स्रोत कोड में मुझे जो मिला है, उसमें शामिल होने के आसपास और अधिक पूर्ण कार्यान्वयन हैं।
11

1
[+-]?((?=\.?\d)\d*\.?\d*)प्रत्यावर्तन से बचने के लिए रेगेक्स का उपयोग किया जा सकता है? यह एक
Lookahead

1
@ 4esn0k अच्छा regex! मैंने इसके साथ खेला है, और यह काम करता है। मेरे पास दो चेतावनी हैं: (1) सभी रेगेक्स इंजन शून्य-चौड़ाई के दावे का समर्थन नहीं करते हैं (हालांकि अधिकांश आधुनिक लोग करते हैं, AFAIK), और (2) लुक-फॉरवर्ड सिर्फ एक अन्य नाम से एक विकल्प है: इंजन को अभी भी कुछ करने की कोशिश करनी है और अगर यह काम नहीं करता है तो पीछे। फिर भी एक बहुत साफ विचार के लिए एक उत्थान है।
pkeller

7

आपको क्या चाहिए:

[\-\+]?[0-9]*(\.[0-9]+)?

मैं "+" और "-" चिन्ह से बच गया और दशमलव को अपने निम्नलिखित अंकों के साथ समूहीकृत कर दिया, क्योंकि "1." एक वैध संख्या नहीं है।

परिवर्तन आपको पूर्णांक और फ़्लोट से मेल खाने की अनुमति देगा। उदाहरण के लिए:

0
+1
-2.0
2.23442

इस अभिव्यक्ति के साथ समस्या यह है कि .1अनुमति नहीं दी जाएगी, हालांकि इस तरह के इनपुट को सार्वभौमिक रूप से सही माना जाता है।
JDB आज भी

यह अब शून्य लंबाई स्ट्रिंग्स को स्वीकार करेगा, -और +, जो संख्या नहीं हैं। रेगेक्स मुश्किल है! :)
JDB आज भी

इसके अलावा, यह ओपी के वास्तविक प्रश्न का उत्तर नहीं देता है, जो कि \.काम नहीं करता है।
JDB आज भी

7

मैं मिलान करना चाहता हूं कि अधिकांश भाषाएं वैध संख्या (पूर्णांक और फ्लोट्स) पर क्या विचार करती हैं:

  • '5' / '-5'

  • '1.0' / '1.' / '.1' / '-1.' / '-.1'

  • '0.45326e+04', '666999e-05', '0.2e-3', '-33.e-1'

टिप्पणियाँ:

  • preceding sign of number ('-' or '+') is optional

  • '-1.' and '-.1' are valid but '.' and '-.' are invalid

  • '.1e3' is valid, but '.e3' and 'e3' are invalid

'1.' दोनों का समर्थन करने के लिए और '.1' हमें यह सुनिश्चित करने के लिए एक OR ऑपरेटर ('|') की आवश्यकता है कि हम बाहर करें '।' मिलान से।

[+-]?+/- गाना वैकल्पिक है क्योंकि ?0 या 1 मैचों का मतलब है

( चूंकि हमारे पास 2 उप अभिव्यक्तियाँ हैं, इसलिए हमें उन्हें कोष्ठक में रखने की आवश्यकता है

\d+([.]\d*)?(e[+-]?\d+)? यह एक अंक से शुरू होने वाली संख्याओं के लिए है

| उप अभिव्यक्तियों को अलग करता है

[.]\d+(e[+-]?\d+)? यह 'से शुरू होने वाली संख्याओं के लिए है।'

) भावों का अंत

  • '' से शुरू होने वाली संख्याओं के लिए।

[.] पहला पात्र डॉट है (कोष्ठक के अंदर या फिर यह एक वाइल्डकार्ड वर्ण है)

\d+ एक या अधिक अंक

(e[+-]?\d+)? यह एक वैकल्पिक (0 या 1 मैच समाप्त होने के कारण है? ') वैज्ञानिक संकेतन

  • अंकों से शुरू होने वाले अंकों के लिए

\d+ एक या अधिक अंक

([.]\d*)? वैकल्पिक रूप से हमारे पास एक डॉट वर्ण हो सकता है एक शून्य या अधिक अंक इसके बाद

(e[+-]?\d+)? यह एक वैकल्पिक वैज्ञानिक संकेतन है

  • वैज्ञानिक संकेत

e शाब्दिक जो प्रतिपादक को निर्दिष्ट करता है

[+-]? वैकल्पिक प्रतिपादक संकेत

\d+ एक या अधिक अंक

सभी संयुक्त:

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

Eसाथ ही स्वीकार करने के लिए :

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

( परीक्षण के मामले )


4

यह सरल है: आपने जावा का उपयोग किया है और आपको \\.इसके बजाय \.(जावा में भागने वाले चरित्र की खोज) का उपयोग करना चाहिए ।


आप शायद सही हैं ... त्रुटि संदेश एक रेगेक्स पार्सर त्रुटि के बजाय एक प्रोग्रामिंग भाषा सिंटैक्स त्रुटि की तरह दिखता है।
JDB अब भी

3

यह एक मेरे लिए काम किया:

(?P<value>[-+]*\d+\.\d+|[-+]*\d+)

आप इस एक (नामित पैरामीटर के बिना) का भी उपयोग कर सकते हैं:

([-+]*\d+\.\d+|[-+]*\d+)

इसका परीक्षण करने के लिए कुछ ऑनलाइन रेगेक्स परीक्षक का उपयोग करें (जैसे regex101)


2
^[+]?([0-9]{1,2})*[.,]([0-9]{1,1})?$

यह मैच होगा:

  1. 1.2
  2. 12.3
  3. 1,2
  4. 12,3

जबकि इस कोड स्निपेट का स्वागत है, और कुछ मदद प्रदान कर सकता है, यह हो जाएगा काफी सुधार हुआ है, तो यह उसका स्पष्टीकरण शामिल की कैसे और क्यों इस को हल करती है समस्या। याद रखें कि आप भविष्य में पाठकों के लिए सवाल का जवाब दे रहे हैं, न कि केवल उस व्यक्ति से जो अब पूछ रहा है! कृपया स्पष्टीकरण जोड़ने के लिए अपना उत्तर संपादित करें, और इस बात का संकेत दें कि क्या सीमाएँ और मान्यताएँ लागू होती हैं।
टोबे स्पाइट

ओह थनक्स, आई एम लॉकिंग फॉर दिस
सर्ग बर्लका

0
[+-]?(([1-9][0-9]*)|(0))([.,][0-9]+)?

[+-]? - वैकल्पिक अग्रणी संकेत

(([1-9][0-9]*)|(0)) - एकल शून्य सहित अग्रणी शून्य के बिना पूर्णांक

([.,][0-9]+)? - वैकल्पिक भिन्नात्मक भाग


1
अधिक जानकारी दें - रेगेक्स के बारे में नहीं जानने वाले लोगों के लिए यह हायरोग्लिफ़्स है। उन्हें जानने वाले लोगों के लिए, उन्हें इसकी आवश्यकता नहीं है।
पीटर - मोनिका

0

C ++ में रेगेक्स लाइब्रेरी का उपयोग कर रहा है

जवाब इस तरह से होगा:

[0-9]?([0-9]*[.])?[0-9]+

ध्यान दें कि मैं साइन सिंबल नहीं लेता, अगर आप इसे सिंबल सिंबल के साथ चाहते थे तो इस बारे में जाना जाएगा:

[+-]?([0-9]*[.])?[0-9]+

यह एक नियमित संख्या या दशमलव संख्या को भी अलग करता है।


0

सी नोटेशन में, फ्लोट संख्या निम्नलिखित आकृतियों में हो सकती है:

  1. 123
  2. 123।
  3. 123.24
  4. .24
  5. 2e-2 = 2 * 10 pow -2 = 2 * 0.1
  6. 4 ई + 4 = 4 * 10 पाव 4 = 4 * 10 000

फ्लोट रेगुलर एक्सप्रेशन बनाने के लिए, मैं सबसे पहले "इंट रेगुलर एक्सप्रेशन वेरिएबल" बनाऊंगा:

(([1-9][0-9]*)|0) will be int

अब, मैं फ्लोट रेग्युलर एक्सप्रेशन के छोटे हिस्से लिखूंगा - समाधान उन टुकड़ों को "या प्रतीक" के साथ समतल करना है।

मात्रा:

- (([+-]?{int}) satysfies case 1
- (([+-]?{int})"."[0-9]*)  satysfies cases 2 and 3
- ("."[0-9]*) satysfies case 4
- ([+-]?{int}[eE][+-]?{int}) satysfies cases 5 and 6

अंतिम समाधान (संक्षिप्त विखंडन):

(([+-]?{int})|(([+-]?{int})"."[0-9]*)|("."[0-9]*)|([+-]?{int}[eE][+-]?{int})


-1

जावास्क्रिप्ट के लिए

const test = new RegExp('^[+]?([0-9]{0,})*[.]?([0-9]{0,2})?$','g');

जो 1.23 1234.22 0 0.12 12 के लिए काम करेगा

आप {}दशमलव की लंबाई और साथ ही दशमलव के सामने अलग-अलग परिणाम प्राप्त करने के लिए भागों को बदल सकते हैं । यह इनपुट में संख्या में प्रवेश करने और हर इनपुट की जांच करने के लिए उपयोग किया जाता है क्योंकि आप केवल पास करने की अनुमति देते हैं।

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