From 6219ad03bbfa1f4b28881d82d007ff5701dcbf00 Mon Sep 17 00:00:00 2001 From: Tindy X <49061470+tindy2013@users.noreply.github.com> Date: Sun, 17 May 2020 20:46:55 +0800 Subject: [PATCH] Fix GROUP/GROUPID/INSERT matcher not correctly handle empty rules --- src/subexport.cpp | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/subexport.cpp b/src/subexport.cpp index f7f2e9c..37ad88c 100644 --- a/src/subexport.cpp +++ b/src/subexport.cpp @@ -407,7 +407,7 @@ bool matchRange(std::string &range, int target) bool match = false; std::string range_begin_str, range_end_str; int range_begin = 0, range_end = 0; - const std::string reg_num = "-?\\d+", reg_range = "(\\d+)-(\\d+)", reg_not = "\\!(\\d+)", reg_not_range = "\\!(\\d+)-(\\d+)", reg_less = "(\\d+)-", reg_more = "(\\d+)\\+"; + const std::string reg_num = "-?\\d+", reg_range = "(\\d+)-(\\d+)", reg_not = "\\!-?(\\d+)", reg_not_range = "\\!(\\d+)-(\\d+)", reg_less = "(\\d+)-", reg_more = "(\\d+)\\+"; for(std::string &x : vArray) { if(regMatch(x, reg_num)) @@ -909,32 +909,28 @@ void parseGroupTimes(const std::string &src, int *interval, int *tolerance, int void groupGenerate(std::string &rule, std::vector &nodelist, std::vector &filtered_nodelist, bool add_direct) { - std::string group; - const std::string groupid_regex = R"(^!!(?:GROUPID|INSERT)=([\d\-+!,]+)(?:!!(.*))?$)"; + std::string group, real_rule; + const std::string groupid_regex = R"(^!!(?:GROUPID|INSERT)=([\d\-+!,]+)(?:!!(.*))?$)", group_regex = R"(^!!(?:GROUP)=(.*?)(?:!!(.*))?$)"; if(rule.find("[]") == 0 && add_direct) { filtered_nodelist.emplace_back(rule.substr(2)); } else if(rule.find("!!GROUP=") == 0) { - if(rule.find("!!", rule.find("!!") + 2) != rule.npos) + regGetMatch(rule, group_regex, 3, NULL, &group, &real_rule); + if(real_rule.empty()) { - group = rule.substr(8, rule.find("!!", rule.find("!!") + 2) - 8); - rule = rule.substr(rule.find("!!", rule.find("!!") + 2) + 2); - for(nodeInfo &y : nodelist) { - if(regFind(y.group, group) && regFind(y.remarks, rule) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end()) + if(regFind(y.group, group) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end()) filtered_nodelist.emplace_back(y.remarks); } } else { - group = rule.substr(8); - for(nodeInfo &y : nodelist) { - if(regFind(y.group, group) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end()) + if(regFind(y.group, group) && regFind(y.remarks, real_rule) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end()) filtered_nodelist.emplace_back(y.remarks); } } @@ -942,9 +938,8 @@ void groupGenerate(std::string &rule, std::vector &nodelist, std::vect else if(rule.find("!!GROUPID=") == 0 || rule.find("!!INSERT=") == 0) { int dir = rule.find("!!INSERT=") == 0 ? -1 : 1; - group = regReplace(rule, groupid_regex, "$1"); - rule = regReplace(rule, groupid_regex, "$2"); - if(rule.empty()) + regGetMatch(rule, groupid_regex, 3, NULL, &group, &real_rule); + if(real_rule.empty()) { for(nodeInfo &y : nodelist) { @@ -956,7 +951,7 @@ void groupGenerate(std::string &rule, std::vector &nodelist, std::vect { for(nodeInfo &y : nodelist) { - if(matchRange(group, dir * y.groupID) && regFind(y.remarks, rule) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end()) + if(matchRange(group, dir * y.groupID) && regFind(y.remarks, real_rule) && std::find(filtered_nodelist.begin(), filtered_nodelist.end(), y.remarks) == filtered_nodelist.end()) filtered_nodelist.emplace_back(y.remarks); } }