ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 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లోడ్ అవుతోంది...

టెక్స్ట్‌లోని ప్రతి `http://...` లేదా `https://...` URLని కనుగొనండి, ఐచ్ఛిక `s` కోసం `?` క్వాంటిఫైయర్‌ని మరియు పాత్‌లోని నాన్-స్పేస్ క్యారెక్టర్‌ల కోసం `\\S+`ని ఉపయోగించి.

ఎడిటర్ లోడ్ అవుతోంది…
సూచనను చూపించు

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 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది