खोज…


मूल बातें

पीछे के संदर्भों का उपयोग उसी पाठ से मेल खाने के लिए किया जाता है जो पहले कैप्चरिंग समूह द्वारा मेल खाता है। यह दोनों आपके पैटर्न के पिछले हिस्सों का पुन: उपयोग करने और एक स्ट्रिंग मैच के दो टुकड़े सुनिश्चित करने में मदद करता है।

उदाहरण के लिए, यदि आप यह सत्यापित करने की कोशिश कर रहे हैं कि एक स्ट्रिंग में शून्य से नौ तक का अंक है, तो एक विभाजक, जैसे कि हाइफ़न, स्लैश या यहां तक कि रिक्त स्थान, एक लोअरकेस अक्षर, दूसरा विभाजक, फिर शून्य से नौ तक एक और अंक, आप कर सकते हैं। इस तरह एक regex का उपयोग करें:

[0-9][-/ ][a-z][-/ ][0-9]

यह 1-a-4 मेल खाता है, लेकिन यह 1-a/4 या 1 a-4 1-a/4 भी मेल खाता है। यदि हम चाहते हैं कि विभाजक मेल खाएं, तो हम एक कैप्चर ग्रुप और बैक रेफरेंस का उपयोग कर सकते हैं। पिछला संदर्भ इंगित कैप्चर समूह में पाए जाने वाले मैच को देखेगा, और यह सुनिश्चित करेगा कि पीछे के संदर्भ का स्थान बिल्कुल मेल खाता हो।

हमारे इसी उदाहरण का उपयोग करके, रेगेक्स बन जाएगा:

[0-9]([-/ ])[a-z]\1[0-9]

The + \1 पैटर्न में पहले कैप्चर ग्रुप को दर्शाता है। इस छोटे से परिवर्तन के साथ, रेगेक्स अब 1-a-4 या 1 a 4 मेल खाता है, लेकिन 1 a-4 या 1-a/4

आपके बैक संदर्भ के लिए उपयोग की जाने वाली संख्या आपके कैप्चर समूह के स्थान पर निर्भर करती है। संख्या एक से नौ तक हो सकती है और अपने कैप्चर समूहों को गिनकर पाया जा सकता है।

([0-9])([-/ ])[a-z][-/ ]([0-9])
|--1--||--2--|          |--3--|

नेस्टेड कैप्चर ग्रुप इस गिनती को थोड़ा बदल देते हैं। आप पहले बाहरी कैप्चर समूह को गिनते हैं, फिर अगले स्तर को, और तब तक जारी रखते हैं जब तक आप घोंसला नहीं छोड़ते:

(([0-9])([-/ ]))([a-z])
 |--2--||--3--|
|-------1------||--4--|

अस्पष्ट पिछड़े संदर्भ

समस्या: आपको एक निश्चित प्रारूप के पाठ से मेल खाना चाहिए, उदाहरण के लिए:

1-a-0
6/p/0
4 g 0

यह एक अंक, एक विभाजक ( - , / , या एक स्थान), एक अक्षर, एक ही विभाजक और एक शून्य है।

Na fromve समाधान: बेसिक्स उदाहरण से रेगेक्स को अपनाना, आप इस रेगेक्स के साथ आते हैं:

[0-9]([-/ ])[a-z]\10

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

इस समस्या से बचने के कई तरीके हैं। एक नामित समूहों (और नामित नाम) का उपयोग करना है:

[0-9](?<sep>[-/ ])[a-z]\k<sep>0

यदि आपकी regex भाषा इसका समर्थन करती है, तो प्रारूप \g{n} (जहाँ n एक संख्या है) पश्चगामी संख्या को घुंघराले कोष्ठक में संलग्न कर सकते हैं, इसके बाद इसे किसी भी अंक से अलग करने के लिए:

[0-9]([-/ ])[a-z]\g{1}0

विस्तारित रेगेक्स फॉर्मेटिंग का उपयोग करने का एक और तरीका है, तत्वों को तुच्छ व्हाट्सएप से अलग करना (जावा में आपको कोष्ठक में जगह से बचने की आवश्यकता होगी):

(?x) [0-9] ([-/ ]) [a-z] \1 0

यदि आपका regex स्वाद उन विशेषताओं का समर्थन नहीं करता है, तो आप गैर-कैप्चरिंग समूह की तरह अनावश्यक लेकिन हानिरहित वाक्यविन्यास जोड़ सकते हैं:

[0-9]([-/ ])[a-z](?:\1)0

... या डमी क्वांटिफायर (संभवतः यह एकमात्र परिस्थिति है जिसमें {1} उपयोगी है):

[0-9]([-/ ])[a-z]\1{1}0


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow