मुख्य सामग्री पर जाएं
मॉड्यूल 2 · पाठ 4 का 4पाठ्यक्रम में 8/32~12 min
मॉड्यूल पाठ (4/4)

बैकट्रैकिंग: एक सिंहावलोकन

जब एक लालची क्वांटिफायर "ओवरशूट" हो जाता है, तो इंजन बैकट्रैकिंग करता है: यह पीछे हटता है, दूसरे कॉन्फ़िगरेशन का प्रयास करता है, पुनः प्रयास करता है। सरल पैटर्न पर यह अदृश्य है; खराब तरीके से लिखे गए पैटर्न पर यह घातीय बन सकता है और ब्राउज़र को कुछ सेकंड के लिए फ़्रीज़ करें. यह ReDoS (नियमित) का मूल है अभिव्यक्ति सेवा से इनकार)।

Code
Pattern: .*\d
Sample:  abc123def
Steps:
  1.  .*  consumes everything: "abc123def"
  2.  \d  fails (end of string).
  3.  Backtrack: .* drops 'f' -> "abc123de", \d fails on 'f'.
  4.  Backtrack: .* drops 'ef' -> "abc123d", \d fails on 'e'.
  5.  ... and so on until \d finds a digit: match = "abc123" + "?"... actually
       the pattern matches "abc123" because .* leaves "def" and \d looks at '3'? No: the
       backtrack continues and .* ends up being "abc12", \d=3.  Final match: "abc123".

इंजन हमेशा वहाँ पहुँचता है, लेकिन अगर कोई लालची क्वांटिफ़ायर होता है एक और लालची परिमाणक (जैसे (a+)+), कॉन्फ़िगरेशन की संख्या कोशिश करने पर विस्फोट हो सकता है.

विनाशकारी पैटर्न

Code
Pattern: (a+)+b
Sample:  aaaaaaaaaaaaaaaaaaaaa

कोई अनुगामी नहीं b → पैटर्न विफल रहता है, लेकिन वहां पहुंचने के लिए इंजन हर कोशिश करता है as का संभावित विभाजन। घातीय वृद्धि: 30 as के साथ आप कर सकते हैं घंटों इंतजार करो.

बैकट्रैकिंग और ReDoS के ख़तरे

जब किसी पैटर्न में ओवरलैपिंग या नेस्टेड क्वांटिफायर होते हैं (उदाहरण के लिए (a+)+), तो इंजन विफल होने से पहले पथों की एक घातीय संख्या का मूल्यांकन करता है। चरित्र वर्गों को छोड़कर सामान्य वाइल्डकार्ड को बदलने से बैकट्रैकिंग पथ नाटकीय रूप से कम हो जाते हैं।

इसे अजमाएं

व्यायाम#regex.m2.l4.e1
प्रयास: 0लोड हो रहा है...

पाठ में प्रत्येक घटना के लिए वर्गाकार कोष्ठकों के बीच की सामग्री निकालें। बाद में समापन पर जाने से बचने के लिए क्वांटिफायर के आलसी संस्करण का उपयोग करें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

\\[.*?\\] पहले समापन पर रुकता है]: कोई भारी बैकट्रैकिंग नहीं।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#regex.m2.l4.e2
प्रयास: 0लोड हो रहा है...

पथ के गैर-स्पेस वर्णों के लिए वैकल्पिक `s` और `\\S+` के लिए `?` क्वांटिफायर का उपयोग करके, टेक्स्ट में प्रत्येक `http://...` या `https://...` URL ढूंढें।

संपादक लोड हो रहा है...
संकेत दिखाएँ

https? इसका अर्थ है 'http' जिसके बाद वैकल्पिक 's' है। फिर //, फिर \\S+ (गैर-रिक्त स्थान)।

3 प्रयासों के बाद समाधान उपलब्ध है

अतिरिक्त चुनौती

व्यायाम#regex.m2.l4.e3
प्रयास: 0लोड हो रहा है...

Match strings enclosed in double quotes, avoiding excessive backtracking by using the negated class `[^"]*` instead of `.*`.

संपादक लोड हो रहा है...
संकेत दिखाएँ

Replace the dot with the negated class [^"] to restrict the engine's backtracking paths.

3 प्रयासों के बाद समाधान उपलब्ध है