टी एल; डॉ
का प्रयोग करें [.]के बजाय \.और [0-9]के बजाय \dकुछ भाषाओं (जावा की तरह) में मुद्दों से बचने से बचने के लिए।
मूल रूप से इसे पहचानने के लिए नाममात्र के लिए धन्यवाद ।
फ्लोटिंग पॉइंट संख्या के मिलान के लिए एक अपेक्षाकृत सरल पैटर्न है
[+-]?([0-9]*[.])?[0-9]+
यह मैच होगा:
एक कार्यशील उदाहरण देखें
यदि आप भी मेल करना चाहते हैं 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अगर कोई मुकाबला नहीं पाया जाता है। यह भी ध्यान रखें कि कुछ इंजन सेट झंडे जो की परिभाषा को बदलने के लिए आप की अनुमति देते हैं ^और $, शुरुआत / बजाय पूरे इनपुट की शुरुआत / अंत एक पंक्ति के अंत से मेल खाते। यह आमतौर पर डिफ़ॉल्ट नहीं है, लेकिन इन झंडों की तलाश में हैं।