Răsfoiți Sursa

Merge pull request #9393 from leezh/regex_capture_fixes

RegEx fixes #9382
Rémi Verschelde 8 ani în urmă
părinte
comite
4b85b66339
1 a modificat fișierele cu 17 adăugiri și 9 ștergeri
  1. 17 9
      modules/regex/regex.cpp

+ 17 - 9
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) {
@@ -598,10 +603,8 @@ struct RegExNodeGroup : public RegExNode {
 
 			int res = childset[i]->test(s, pos);
 
-			if (s.complete)
-				return res;
-
 			if (inverse) {
+				s.complete = false;
 				if (res < 0)
 					res = pos + 1;
 				else
@@ -611,9 +614,13 @@ struct RegExNodeGroup : public RegExNode {
 					continue;
 			}
 
+			if (s.complete)
+				return res;
+
 			if (res >= 0) {
 				if (reset_pos)
 					res = pos;
+				this->test_success(s, res);
 				return next ? next->test(s, res) : res;
 			}
 		}
@@ -668,6 +675,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 +689,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;
 	}