एक वर्ग में वर्ग कोष्ठक और कोष्ठक के बीच अंतर क्या है?


101

यहाँ एक नियमित अभिव्यक्ति है जिसे मैंने जावास्क्रिप्ट में उपयोग करने के लिए बनाया है:

var reg_num = /^(7|8|9)\d{9}$/

यहाँ एक और मेरी टीम के सदस्य द्वारा सुझाया गया है।

var reg_num = /^[7|8|9][\d]{9}$/

नियम एक फोन नंबर को मान्य करने के लिए है:

  • यह केवल दस संख्याओं का होना चाहिए।
  • पहली संख्या 7, 8 या 9 में से किसी को माना जाता है।

जवाबों:


124

ये regexes समतुल्य हैं (मेल खाते उद्देश्यों के लिए):

  • /^(7|8|9)\d{9}$/
  • /^[789]\d{9}$/
  • /^[7-9]\d{9}$/

स्पष्टीकरण:

  • (a|b|c)एक रेगेक्स "ओआर" है और इसका अर्थ है "ए या बी या सी", हालांकि ओआरटी के लिए आवश्यक कोष्ठक की उपस्थिति भी अंक को पकड़ती है। कड़ाई से समकक्ष होने के लिए, आप (?:7|8|9)इसे एक गैर कैप्चरिंग समूह बनाने के लिए कोड करेंगे ।

  • [abc]एक "वर्ण वर्ग" है जिसका अर्थ है "a, b या c से कोई भी वर्ण" (एक वर्ण वर्ग श्रेणियों का उपयोग कर सकता है, उदा [a-d]= [abcd])

इन रेगेक्स का कारण समान है कि एक चरित्र वर्ग एक "या" (लेकिन केवल एकल पात्रों के लिए) एक शॉर्टहैंड है। एक विकल्प में, आप कुछ ऐसा भी कर सकते हैं (abc|def)जो चरित्र वर्ग में अनुवाद नहीं करता है।


30
(7|8|9)और [789]समतुल्य नहीं हैं, क्योंकि पहला कब्जा कर रहा है, बाद वाला नहीं। (?:7|8|9)दूसरी ओर बराबर होगा (मुझे लगता है कि आप जानते हैं कि निश्चित रूप से ...)।
hochl

मैं इस regex देख रहा हूँ [<<|>>|\]\]|\[\[]:। संदर्भ की वजह से, मुझे पता है कि रेगुलर एक्सप्रेशन से मेल करने के लिए कोशिश कर रहा है <<या >>या [[या ]]। लेकिन तुम क्या कहा है, यह मिलान किया जाना चाहिए <या >या [या ]। यदि आप |बीच का उपयोग []करते हैं, तो क्या कोष्ठक अलग तरह से व्यवहार करते हैं?
डैनियल कपलान

1
@DanielKaplan |एक चरित्र वर्ग के भीतर उपयोग नहीं करते हैं [...], जब तक कि आप स्वयं पाइप चरित्र से मेल नहीं खाना चाहते। इसके अलावा एक चरित्र वर्ग में वर्णों की नकल करने का कोई प्रभाव नहीं पड़ता है - एक चरित्र वर्ग पात्रों की एक सूची है और उनमें से बिल्कुल एक मैच होगा। मेरा अनुमान है कि आप एक चाहते है समूह : जो सामान्य दौर कोष्ठक का उपयोग करता है(<<|>>|\]\]|\[\[)
बोहेमियन

57

आपकी टीम की सलाह लगभग सही है, जो गलती की गई थी, उसे छोड़कर। एक बार जब आपको पता चल जाता है कि आप इसे क्यों नहीं भूलेंगे। इस गलती पर एक नजर।

/^(7|8|9)\d{9}$/

यह क्या करता है:

  • ^और $एंकर युक्त मैचों को दर्शाता है, जो यह दावा करता है कि इन एंकरों के बीच का सबपैटर्न पूरा मैच है। स्ट्रिंग केवल तभी मेल खाएगी जब सबपैटर्न उस से पूरी तरह से मेल खाए, न कि केवल एक सेक्शन से।
  • ()एक कैप्चरिंग ग्रुप को दर्शाता है ।
  • 7|8|9अर्थ है दोनों में से किसी से मेल खाते 7, 8या 9। यह विकल्प के साथ ऐसा करता है , जो कि पाइप ऑपरेटर |करता है - प्रत्यावर्तन के बीच बारी-बारी से। इस प्रत्यावर्तन के बीच प्रत्यावर्तन: यदि प्रथम प्रत्यावर्तन का मिलान नहीं किया जाता है, तो इंजन को प्रत्यावर्तन स्थान से पहले लौटना पड़ता है, अल्टरनेशन के मिलान के दौरान, अल्टरनेशन के मिलान को जारी रखने के लिए; जबकि चरित्र वर्ग क्रमिक रूप से आगे बढ़ सकता है। इस मैच को रेगेक्स इंजन पर देखें जिसमें ऑप्टिमाइज़ेशन अक्षम है:
Pattern: (r|f)at
Match string: carat

alternations

Pattern: [rf]at
Match string: carat

कक्षा

  • \d{9}नौ अंकों से मेल खाता है। \dएक शॉर्टहैंड मेटाचैकर है, जो किसी भी अंक से मेल खाता है।
/^[7|8|9][\d]{9}$/

देखो क्या करता है:

  • ^और $लंगर वाले मैचों को भी दर्शाता है।
  • [7|8|9]एक चरित्र वर्ग है । सूची में से कोई भी वर्ण 7, |, 8, |, या 9मिलान किया जा सकता है, इस प्रकार |गलत तरीके से में जोड़ा गया है। यह बिना बैकग्राउंड के मैच करता है।
  • [\d]एक चरित्र वर्ग है जो मेटाचैकर का निवास करता है \d। एक चरित्र वर्ग और एकल मेटाचैकर के उपयोग का संयोजन एक बुरा विचार है, वैसे, चूंकि अमूर्तता की परत मैच को धीमा कर सकती है, लेकिन यह केवल एक कार्यान्वयन विवरण है और केवल कुछ रेगेक्स कार्यान्वयन पर लागू होता है। जावास्क्रिप्ट एक नहीं है, लेकिन यह उपपट्ट को थोड़ा लंबा कर देता है।
  • {9} इंगित करता है कि पिछला एकल निर्माण कुल नौ बार दोहराया गया है।

इष्टतम रेगेक्स है /^[789]\d{9}$/, क्योंकि /^(7|8|9)\d{9}$/अनावश्यक रूप से कैप्चर करता है जो अधिकांश रेगेक्स कार्यान्वयन पर एक प्रदर्शन में कमी लाता है (एक होता है, प्रश्न varको कोड में कीवर्ड का उपयोग करता है , यह शायद जावास्क्रिप्ट है)। का उपयोगजो प्रीग मैचिंग के लिए पीसीआरई पर चलता है, बैकट्रैकिंग की कमी को दूर करेगा, हालांकि हम PHP में भी नहीं हैं, इसलिए []वैकल्पिक के बजाय कक्षाओं का उपयोग करने से |प्रदर्शन बोनस मिलता है क्योंकि मैच बैकट्रैक नहीं करता है, और इसलिए दोनों मैच और आपके उपयोग से तेजी से विफल होते हैं। पिछले नियमित अभिव्यक्ति।


6
बस दिलचस्पी से, उस स्क्रीनशॉट से क्या कार्यक्रम है?
मिस्टर गेस्ट

12

पहले 2 उदाहरण बहुत अलग तरीके से कार्य करते हैं यदि आप उन्हें किसी चीज से रिप्लाई कर रहे हैं। यदि आप इस पर मेल खाते हैं:

str = str.replace(/^(7|8|9)/ig,''); 

आप खाली स्ट्रिंग द्वारा 7 या 8 या 9 की जगह लेंगे।

यदि आप इस पर मेल खाते हैं

str = str.replace(/^[7|8|9]/ig,''); 

आप की जगह लेगा 7या 8या 9या लंबवत बार !!!! खाली तार द्वारा।

मुझे यह मुश्किल तरीका लगा।


6
एसओ में आपका स्वागत है! प्रतिस्थापित करना या मिलान करना, यह केवल स्पष्ट गलत है। बहुत सारे लोग उस गलती को करते हैं, और वे आमतौर पर इसके साथ दूर हो जाते हैं - वर्षों के लिए, कभी-कभी - क्योंकि उनके इनपुट स्ट्रिंग्स में कभी भी पाइप ( |) नहीं होता है ।
एलन मूर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.