लालची बनाम गैर-लालची
डिफ़ॉल्ट रूप से रेगेक्स में पुनरावृत्ति लालची है : वे अधिक से अधिक प्रतिनिधि मैच करने की कोशिश करते हैं, और जब यह काम नहीं करता है और उन्हें पीछे हटना पड़ता है, तो वे एक बार में एक कम प्रतिनिधि से मेल खाने की कोशिश करते हैं, जब तक कि पूरे पैटर्न का एक मैच नहीं होता है। मिल गया। नतीजतन, जब एक मैच अंत में होता है, एक लालची दोहराव के रूप में कई मैच होगा प्रतिनिधि के रूप में संभव है।
?
पुनरावृत्ति परिमाणक में इस व्यवहार में परिवर्तन के रूप में गैर लालची भी कहा जाता है अनिच्छुक ( जैसे जावा में ) (और कभी कभी "आलसी")। इसके विपरीत, यह पुनरावृत्ति सबसे पहले संभव के रूप में कुछ प्रतिनिधि से मेल खाने की कोशिश करेगा , और जब यह काम नहीं करता है और उन्हें पीछे हटना पड़ता है, तो वे एक बार फिर से एक और मिलान शुरू करते हैं। नतीजतन, जब एक मैच अंत में होता है, तो एक अनिच्छुक पुनरावृत्ति संभव के रूप में कुछ प्रतिनिधि से मेल खाती है।
संदर्भ
उदाहरण 1: A से Z तक
आइए इन दो पैटर्नों की तुलना करें: A.*Z
और A.*?Z
।
निम्नलिखित इनपुट को देखते हुए:
eeeAiiZuuuuAoooZeeee
पैटर्न निम्नलिखित मैचों का उत्पादन करते हैं:
आइए पहले ध्यान दें कि क्या A.*Z
करता है। जब यह पहले से मेल खाता था A
, तो .*
लालची होने के नाते, पहले .
जितना संभव हो उतना मिलान करने की कोशिश करता है।
eeeAiiZuuuuAoooZeeee
\_______________/
A.* matched, Z can't match
चूंकि Z
मेल नहीं खाता है, इंजन पीछे हटता है, और .*
फिर एक कम से मेल खाना चाहिए .
:
eeeAiiZuuuuAoooZeeee
\______________/
A.* matched, Z still can't match
यह कुछ और बार होता है, जब तक कि आखिरकार हम इस पर नहीं आते:
eeeAiiZuuuuAoooZeeee
\__________/
A.* matched, Z can now match
अब Z
मिलान कर सकते हैं, इसलिए समग्र पैटर्न मेल खाता है:
eeeAiiZuuuuAoooZeeee
\___________/
A.*Z matched
इसके विपरीत, A.*?Z
पहले मैच में अनिच्छुक पुनरावृत्ति .
संभव के रूप में कुछ के रूप में, और फिर .
आवश्यक के रूप में अधिक ले रहा है। यह बताता है कि यह इनपुट में दो मैच क्यों ढूंढता है।
यहाँ दो पैटर्न क्या मिला का एक दृश्य प्रतिनिधित्व है:
eeeAiiZuuuuAoooZeeee
\__/r \___/r r = reluctant
\____g____/ g = greedy
उदाहरण: एक विकल्प
कई अनुप्रयोगों में, उपरोक्त इनपुट में दो मैच वांछित है, इस प्रकार अतिरेक को रोकने .*?
के लिए लालची के बजाय अनिच्छुक उपयोग किया जाता है .*
। इस विशेष पैटर्न के लिए, हालांकि, नकारात्मक चरित्र वर्ग का उपयोग करते हुए एक बेहतर विकल्प है।
पैटर्न A[^Z]*Z
भी A.*?Z
उपरोक्त इनपुट के लिए पैटर्न के रूप में एक ही दो मैच पाता है ( जैसा कि ideone.com पर देखा गया है )। [^Z]
जिसे एक नकारात्मक चरित्र वर्ग कहा जाता है : यह किसी भी चीज़ से मेल खाता है लेकिनZ
।
दो पैटर्न के बीच मुख्य अंतर प्रदर्शन में है: अधिक सख्त होने के नाते, नकारात्मक चरित्र वर्ग केवल दिए गए इनपुट के लिए एक ही तरीके से मेल खा सकता है। इससे कोई फर्क नहीं पड़ता कि आप इस पैटर्न के लिए लालची या अनिच्छुक संशोधक का उपयोग करते हैं। वास्तव में, कुछ स्वादों में, आप और भी बेहतर कर सकते हैं और उपयोग किया जा सकता है, जिसे अधिकारपूर्ण क्वांटिफायर कहा जाता है, जो बिल्कुल भी पीछे नहीं हटता है।
संदर्भ
उदाहरण 2: A से ZZ तक
यह उदाहरण चित्रमय होना चाहिए: यह दिखाता है कि लालची, अनिच्छुक और नकारा चरित्र वर्ग पैटर्न एक ही इनपुट को अलग तरह से कैसे मेल खाते हैं।
eeAiiZooAuuZZeeeZZfff
उपरोक्त इनपुट के लिए ये मैच हैं:
यहाँ वे क्या मिलान का एक दृश्य प्रतिनिधित्व है:
___n
/ \ n = negated character class
eeAiiZooAuuZZeeeZZfff r = reluctant
\_________/r / g = greedy
\____________/g
संबंधित विषय
ये स्टैकओवरफ्लो पर सवाल और जवाब के लिंक हैं जो कुछ विषयों को कवर करते हैं जो रुचि के हो सकते हैं।
एक लालची पुनरावृत्ति दूसरे से आगे निकल सकती है