Merge pull request #9393 from leezh/regex_capture_fixes

RegEx fixes #9382
This commit is contained in:
Rémi Verschelde 2017-06-26 22:23:32 +02:00 committed by GitHub
commit 4b85b66339

View file

@ -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;
}