उम्मीद के मुताबिक काम क्यों नहीं [01-12] रेंज?


91

मैं [01-12]दो अंकों मिमी से मेल खाने के लिए रेगेक्स में रेंज पैटर्न का उपयोग करने की कोशिश कर रहा हूं , लेकिन यह अपेक्षा के अनुरूप काम नहीं करता है।


8
आप वर्णों से मेल खा रहे हैं , वर्ण क्रम नहीं । असल में, आप 0, 1 से 1, और 2 (यानी 0, 1 और 2) के खिलाफ मैच कर रहे हैं। इस पर विचार करें: [a-z0-9]यह सभी लोअरकेस अक्षर और सभी अंकों से मेल खाता है, लेकिन केवल एक चरित्र के रूप में।
लास वी। कार्लसन

fwiw मैंने एक जावास्क्रिप्ट टूल बनाया है जो दो इनपुट्स (न्यूनतम / अधिकतम) github.com/jonschlinkert/to-regex-range
jonschlinkert

0 [1-9] | 1 [0-2] -> 0 | 1 | 2 -> [] regex में एक वर्ण वर्ग को दर्शाते हैं। यदि कोई पर्वतमाला निर्दिष्ट नहीं है, तो यह प्रत्येक चरित्र का अर्थ है।
बद्री जीएस

क्या आपको शुद्ध रेगेक्स के साथ मेल खाना चाहिए? यदि नहीं, तो आप कर सकते हैं: 1.) बस \d+पैटर्न का उपयोग करें , 2.) मिलान किए गए तारों को अपने कोड में संख्याओं में परिवर्तित करें। और फिर, 3.) की तरह संख्या सीमा की जाँच करें if(num >= 0 && num <= 12){ /*do something*/ }। यह इतना तेज और लचीला है।
ऐस

जवाबों:


192

आपको गलतफहमी हुई लगती है कि चरित्र वर्ग परिभाषा रेगेक्स में कैसे काम करती है।

तार के किसी भी मैच के लिए 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, या 12, इस काम करता है की तरह कुछ:

0[1-9]|1[0-2]

संदर्भ


व्याख्या

एक वर्ण वर्ग, अपने आप में, इनपुट स्ट्रिंग से एक और एक वर्ण का मिलान करने का प्रयास करता है । [01-12]वास्तव में परिभाषित करता है [012], एक चरित्र वर्ग है कि 3 वर्णों के किसी के खिलाफ इनपुट से एक चरित्र से मेल खाता है 0, 1या 2

-सीमा परिभाषा से चला जाता है 1के लिए 1, जो सिर्फ शामिल 1। दूसरी ओर, कुछ की तरह [1-9]शामिल हैं 1, 2, 3, 4, 5, 6, 7, 8, 9

शुरुआती लोग अक्सर चीजों को परिभाषित करने की गलती करते हैं [this|that]। यह "काम" नहीं करता है। यह चरित्र परिभाषा परिभाषित करता है [this|a], यानी यह 6 वर्ण की किसी भी के खिलाफ इनपुट से एक चरित्र से मेल खाता है t, h, i, s, |या a। अधिक से अधिक संभावना (this|that)है कि क्या इरादा है।

संदर्भ


सीमाएं कैसे परिभाषित की जाती हैं

तो अब यह स्पष्ट है कि एक पैटर्न between [24-48] hours"काम" नहीं करता है। इस मामले में वर्ण वर्ग के बराबर है [248]

यही है, -एक चरित्र वर्ग परिभाषा में पैटर्न में संख्यात्मक सीमा को परिभाषित नहीं किया गया है। Regex इंजन वास्तव में पैटर्न में "समझ" संख्याओं को सीमित नहीं करता है, परिमित पुनरावृत्ति सिंटैक्स के अपवाद के साथ (उदाहरण a{3,5}के लिए 3 और 5 के बीच मेल खाता हैa ) होता है।

इसके बजाय रेंज की परिभाषा श्रेणियों को परिभाषित करने के लिए वर्णों के ASCII / यूनिकोड एन्कोडिंग का उपयोग करती है। चरित्र 0को ASCII में दशमलव 48 के रूप में एन्कोड किया गया है; 957 है। इस प्रकार, वर्ण परिभाषा [0-9]में सभी वर्ण शामिल हैं जिनके मान एन्कोडिंग में दशमलव 48 और 57 के बीच हैं। बल्कि समझदारी से, डिजाइन द्वारा इन चरित्र 0, 1, ...,9

यह सभी देखें


एक और उदाहरण: ए टू जेड

आइए एक और आम चरित्र वर्ग परिभाषा पर एक नज़र डालें [a-zA-Z]

ASCII में:

  • A = 65, Z = 90
  • a= 97, z= 122

इस का मतलब है कि:

  • [a-zA-Z]और [A-Za-z]बराबर हैं
  • अधिकांश स्वादों में, [a-Z]एक अवैध चरित्र श्रेणी होने की संभावना है
    • क्योंकि a(97) " Z(90) से अधिक" है
  • [A-z] कानूनी है, लेकिन इसमें ये छह वर्ण भी शामिल हैं:
    • [(91), \(92), ](93), ^(94), _(95), `(96)

संबंधित सवाल


मेरे लिए, मैं 0 के साथ उपसर्ग के बिना महीनों की तलाश कर रहा था यदि एकल अंक। और मैंने इसका इस्तेमाल किया ([1-9] | (1 [0-2])) और यह काम करता है।
बनर्जी

2
नोट करने के लिए महत्वपूर्ण: यदि आप इस पृष्ठ को अपनी संख्या सीमा के लिए एक समाधान चाहते हैं जो केवल दस अंकों के लिए एकल अंक है, 0[1-9]|1[0-2]तो काम नहीं करेगा। तार्किक अगले कदम के लिए इसे बदलने [1-9]|1[0-2]समझ में आता कारणों (यह मैच के लिए या तो काम नहीं करता है 1केवल में 10, 11और, 12)। \b(?:[0-9]|1[0-1])\bजिसे रोकने के लिए उपयोग करना पड़ा । \bयह सुनिश्चित करता है कि रेगेक्स शब्द (या इस मामले की संख्या में) सीमाओं ( ^और $नहीं) से मेल खाता है ; कोष्ठक या ( |) इसके दूसरे पक्ष पर विचार करते हैं; और अंत ?:में कोष्ठक के उपयोग के साथ एक उपमेय नहीं बनाना है।
user66001

@ पॉली ऑक्सिजन: "1,2,3,4,5,6,7,8,9,10,17,18".match(/^(([1-9]|1[0-7])\,?)+$/g )आप क्या मुझे बता सकते हैं कि यह जेएस रेगेक्स 17 से ऊपर क्यों है?
एडाम

@edam - polygenelubricants, और इसलिए मैं, लेकिन फिर हम होगी सकता है हो सकता है जवाब देने के एक questi ... इंतजार ... यह एक है सवाल आप एक में पूछ रहे हैं टिप्पणी ? इस साइट पर नियम हैं ;) एक प्रश्न पूछें यदि आपके पास एक नया प्रश्न है। टिप्पणियाँ केवल आलोचना करने और स्पष्टीकरण मांगने और उन पर प्रतिक्रिया देने के लिए हैं।
रॉबिनटेकस

1
@ हेडम ओह, मैं देख रहा हूं। आप था यह एक प्रश्न एक घंटे बाद के रूप में फिर से पूछो। एक दम बढ़िया! हालाँकि, यहाँ अपनी टिप्पणी को हटाना एक अच्छा विचार होगा।
रॉबिनटेकस

24

[...]वाक्यविन्यास द्वारा निरूपित नियमित अभिव्यक्तियों में एक वर्ण वर्ग, इनपुट में एकल वर्ण से मेल खाने के लिए नियमों को निर्दिष्ट करता है । जैसे, कोष्ठक के बीच आप जो कुछ भी लिखते हैं वह निर्दिष्ट करता है कि किसी एकल वर्ण से कैसे मिलान करें ।

[01-12]इस प्रकार आपका पैटर्न निम्नानुसार टूट गया है:

  • 0 - एकल अंक 0 से मेल खाता है
  • या, 1-1, 1 के माध्यम से 1 की सीमा में एक अंक का मिलान करें
  • या, 2, एकल अंक 2 से मेल खाता है

इसलिए मूल रूप से आप जो भी मिलान कर रहे हैं, वह 0, 1 या 2 है।

आपके इच्छित मिलान करने के लिए, दो अंको का मिलान करते हुए, संख्या के रूप में 01-12 से लेकर, आपको यह सोचने की आवश्यकता है कि वे पाठ के रूप में कैसे दिखेंगे।

आपके पास:

  • 01-09 (यानी पहला अंक 0 है, दूसरा अंक 1-9 है)
  • 10-12 (यानी पहला अंक 1 है, दूसरा अंक 0-2 है)

फिर आपको उसके लिए एक नियमित अभिव्यक्ति लिखनी होगी, जो इस तरह दिख सकती है:

  +-- a 0 followed by 1-9
  |
  |      +-- a 1 followed by 0-2
  |      |
<-+--> <-+-->
0[1-9]|1[0-2]
      ^
      |
      +-- vertical bar, this roughly means "OR" in this context

ध्यान दें कि अमान्य इनपुट के लिए गलत सकारात्मक मिलान देने से छोटी अभिव्यक्ति पाने के लिए उन्हें संयोजित करने का प्रयास विफल हो जाएगा।

उदाहरण के लिए, पैटर्न [0-1][0-9]मूल रूप से संख्या 00-19 से मेल खाएगा, जो आप चाहते हैं की तुलना में थोड़ा अधिक है।

मैंने वर्ण वर्गों के बारे में अधिक जानकारी के लिए एक निश्चित स्रोत खोजने की कोशिश की, लेकिन अब मैं आप सभी को यह दे सकता हूं कि आप Regeor Character Classes के लिए यह Google Query है । उम्मीद है कि आप अपनी मदद के लिए कुछ और जानकारी पा सकेंगे।


9

यह भी काम करता है:

^([1-9]|[0-1][0-2])$

[1-9] 1 और 9 के बीच एकल अंकों से मेल खाता है

[0-1][0-2] 10 और 12 के बीच दोहरे अंकों से मेल खाता है

यहाँ कुछ अच्छे उदाहरण हैं


2
सटीक होने के लिए, [0-1][0-2]मेल भी खाता है 00। उस लिंक के लिए +1, (जो मैंने अपने उत्तर में उपयोग किया है)।
पॉलीजेन लुब्रीकेंट

2
[0-1][0-2]ध्यान से व्याख्या की जानी चाहिए, के रूप में यह तार की तरह की अनुमति देता है 00, 01और 02है, लेकिन इसे स्वीकार नहीं करता है 03अप करने के लिए 09, अंत में स्वीकार करने 10, 11और 12। इसके लिए एक सही रेगेक्स है [1-9]|1[0-2], या यहां तक ​​कि 0*([1-9]|1[0-2])(यह आखिरी किसी भी अग्रणी शून्य की अनुमति देता है)।
लुइस कोलोराडो

1

[]एक निरूपित एक regex में चरित्र वर्ग । यदि कोई सीमा निर्दिष्ट नहीं है, तो यह अंतर्निहित रूप से या इसके भीतर प्रत्येक वर्ण को एक साथ जोड़ता है। इस प्रकार, के [abcde]रूप में ही है (a|b|c|d|e), सिवाय इसके कि यह कुछ भी कब्जा नहीं करता है; यह में से किसी एक से मेल खाएगी a, b, c, d, या e। सभी रेंज इंगित करती है कि पात्रों का एक सेट है ; [ac-eg]कहते हैं, "किसी से भी मेल खाता है a; cऔर के बीच कोई भी चरित्र e; या g"। इस प्रकार, अपने मैच कहते हैं, "में से किसी एक से मेल खाते हैं: 0; के बीच किसी भी चरित्र 1और 1( यानी , बस 1); या 2

आपका लक्ष्य स्पष्ट रूप से एक संख्या सीमा निर्दिष्ट करने के लिए है: किसी भी संख्या के बीच 01और 12दो अंकों के साथ लिखा गया। इस विशिष्ट मामले में, आप इसके साथ मिलान कर सकते हैं 0[1-9]|1[0-2]: या तो एक 0के बीच किसी भी अंक की 1और 9है, या एक 1के बीच किसी भी अंक की 0और 2। सामान्य तौर पर, आप किसी भी संख्या सीमा को एक समान तरीके से एक वैध रेगेक्स में बदल सकते हैं। नियमित अभिव्यक्तियों की तुलना में एक बेहतर विकल्प हो सकता है, हालांकि, या एक मौजूदा फ़ंक्शन या मॉड्यूल जो आपके लिए regex का निर्माण कर सकता है। यह आपकी भाषा पर निर्भर करता है।


0

जैसा कि पॉलीजेनक्लूबेंट कहते हैं कि आप अपनी इच्छा के बजाय 0 - 1-1 | 2 की तलाश करेंगे, इस तथ्य के कारण कि वर्ण वर्ग ([] में चीजें) तार के बजाय पात्रों से मेल खाते हैं।


3
0|1-1|2- यह धारणा बहुत ही भ्रामक है। जैसे कुछ 0|1|2और सटीक होगा।
पॉलीजेन लुब्रिकेंट्स

0

इसे इस्तेमाल करो:

0?[1-9]|1[012]
  • 07: मान्य है
  • 7: वैध
  • 0: मैच नहीं
  • 00: मैच नहीं
  • 13: मैच नहीं
  • 21: मैच नहीं

पैटर्न का परीक्षण करने के लिए 07/2018 इसका उपयोग करें:

/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/

(दिनांक सीमा 01/2000 से 12/9999 के बीच)


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