Procházet zdrojové kódy

Fixes RegEx capture grabbing too much #9382

Incorrect behaviour was caused when next->test was throwing off the
results.
Zher Huei Lee před 8 roky
rodič
revize
382db0898e
1 změnil soubory, kde provedl 13 přidání a 6 odebrání
  1. 13 6
      modules/regex/regex.cpp

+ 13 - 6
modules/regex/regex.cpp

@@ -590,6 +590,11 @@ struct RegExNodeGroup : public RegExNode {
 			memdelete(childset[i]);
 	}
 
+	virtual void test_success(RegExSearch &s, int pos) const {
+
+		return;
+	}
+
 	virtual int test(RegExSearch &s, int pos) const {
 
 		for (int i = 0; i < childset.size(); ++i) {
@@ -614,6 +619,7 @@ struct RegExNodeGroup : public RegExNode {
 			if (res >= 0) {
 				if (reset_pos)
 					res = pos;
+				this->test_success(s, res);
 				return next ? next->test(s, res) : res;
 			}
 		}
@@ -668,6 +674,12 @@ struct RegExNodeCapturing : public RegExNodeGroup {
 		id = p_id;
 	}
 
+	virtual void test_success(RegExSearch &s, int pos) const {
+
+		RegExMatch::Group &ref = s.match->captures[id];
+		ref.length = pos - ref.start;
+	}
+
 	virtual int test(RegExSearch &s, int pos) const {
 
 		RegExMatch::Group &ref = s.match->captures[id];
@@ -676,13 +688,8 @@ struct RegExNodeCapturing : public RegExNodeGroup {
 
 		int res = RegExNodeGroup::test(s, pos);
 
-		if (res >= 0) {
-			if (!s.complete)
-				ref.length = res - pos;
-		} else {
+		if (res < 0)
 			ref.start = old_start;
-		}
-
 		return res;
 	}