diff --git a/re2/set.cc b/re2/set.cc index 771061723634a641445333072115da5661067819..76aa7dd840c372260851552293829c9bc6a35993 100644 --- a/re2/set.cc +++ b/re2/set.cc @@ -79,7 +79,7 @@ namespace re2 } else { - elem_.push_back(pair(pattern.as_string(), nullptr)); + elem_.push_back(pair(pattern.as_string(), (re2::Regexp*)re)); size_++; // rure_free(re); return place_num; @@ -145,7 +145,6 @@ namespace re2 { if(v == NULL) { - bool result = rure_set_is_match((rure_set *)prog_.get(), (const uint8_t *)pat_str, length, 0); return result; @@ -165,49 +164,31 @@ namespace re2 } break; } - case RE2::ANCHOR_BOTH: { - if(v == NULL) + bool matches[elem_.size()]; + bool result = rure_set_matches((rure_set *)prog_.get(), + (const uint8_t *)pat_str, length, 0, matches); + if(!result) return false; + if(v != NULL) v->clear(); + for(size_t i = 0; i < elem_.size(); i++) { - bool matches[elem_.size()]; - bool result = rure_set_matches((rure_set *)prog_.get(), - (const uint8_t *)pat_str, length, 0, matches); - if(!result) return false; - for(size_t i = 0; i < elem_.size(); i++) + if(matches[i]) { - if(matches[i]) + rure *re = (rure*)elem_[i].second; + rure_match match = {0}; + rure_find(re, (const uint8_t *)pat_str, strlen(pat_str), + 0, &match); + if(match.start == 0 && match.end == strlen(pat_str)) { - const char *pattern = elem_[i].first.c_str(); - rure *re = rure_compile_must(pattern); - rure_match match = {0}; - rure_find(re, (const uint8_t *)pat_str, strlen(pat_str), - 0, &match); - if(match.start == 0 && match.end == strlen(pat_str)) return true; - } - + if(v) v->push_back(i); // v不空的情形,把索引加入到v中 + else return true; // v为NULL, 直接返回匹配成功的情形 + } } - return false; } - else - { - v->clear(); - bool matches[elem_.size()]; - bool result = rure_set_matches((rure_set *)prog_.get(), - (const uint8_t *)pat_str, length, 0, matches); - if(!result) return false; - for(size_t i = 0; i < elem_.size(); i++) - { - if(matches[i]) - { - const char *pattern = elem_[i].first.c_str(); - rure *re = rure_compile_must(pattern); - rure_match match = {0}; - rure_find(re, (const uint8_t *)pat_str, strlen(pat_str), - 0, &match); - if(match.start == 0 && match.end == strlen(pat_str)) v->push_back(i); - } - } + if(v == NULL) return false; // v为空的情况 + else // v不为空的情况,若经过处理后v中存储了相关索引,则返回true,否则false + { if(v->size()) return true; else return false; } @@ -215,27 +196,54 @@ namespace re2 } case RE2::ANCHOR_START: { - if(v == NULL) + bool matches[elem_.size()]; + bool result = rure_set_matches((rure_set *)prog_.get(), + (const uint8_t *)pat_str, length, 0, matches); + if(!result) return false; + if(v != NULL) v->clear(); + for(size_t i = 0; i < elem_.size(); i++) { - - bool result = rure_set_is_match((rure_set *)prog_.get(), - (const uint8_t *)pat_str, length, 0); - return result; - } - else - { - v->clear(); - bool matches[elem_.size()]; - bool result = rure_set_matches((rure_set *)prog_.get(), - (const uint8_t *)pat_str, length, 0, matches); - if(!result) return false; - for(size_t i = 0; i < elem_.size(); i++) + if(matches[i]) { - if(matches[i]) v->push_back(i); + rure *re = (rure*)elem_[i].second; + rure_match match = {0}; + rure_find(re, (const uint8_t *)pat_str, strlen(pat_str), + 0, &match); + if(match.start == 0) + { + if(v) v->push_back(i); // v不空的情形,把索引加入到v中 + else return true; // v为NULL, 直接返回匹配成功的情形 + } } - return true; + } + if(v == NULL) return false; // v为空的情况 + else // v不为空的情况,若经过处理后v中存储了相关索引,则返回true,否则false + { + if(v->size()) return true; + else return false; } break; + // if(v == NULL) + // { + + // bool result = rure_set_is_match((rure_set *)prog_.get(), + // (const uint8_t *)pat_str, length, 0); + // return result; + // } + // else + // { + // v->clear(); + // bool matches[elem_.size()]; + // bool result = rure_set_matches((rure_set *)prog_.get(), + // (const uint8_t *)pat_str, length, 0, matches); + // if(!result) return false; + // for(size_t i = 0; i < elem_.size(); i++) + // { + // if(matches[i]) v->push_back(i); + // } + // return true; + // } + // break; } } return true; diff --git a/re2/testing/set_test.cc b/re2/testing/set_test.cc index b03c96712ce1e63fcb691ccae80b6bdf6a5fe7f7..a7feb4c7bb928596f39fed29ef7fc134b573441f 100644 --- a/re2/testing/set_test.cc +++ b/re2/testing/set_test.cc @@ -51,21 +51,16 @@ TEST(Set, AnchorStart) { ASSERT_EQ(s.Match("foobar", NULL), true); ASSERT_EQ(s.Match("fooba", NULL), true); - ASSERT_EQ(s.Match("oobar", NULL), true); + ASSERT_EQ(s.Match("oobar", NULL), false); std::vector v; ASSERT_EQ(s.Match("foobar", &v), true); - ASSERT_EQ(v.size(), 2); - ASSERT_EQ(v[0], 0); - ASSERT_EQ(v[1], 1); - - ASSERT_EQ(s.Match("fooba", &v), true); ASSERT_EQ(v.size(), 1); ASSERT_EQ(v[0], 0); - ASSERT_EQ(s.Match("oobar", &v), true); - ASSERT_EQ(v.size(), 1); - ASSERT_EQ(v[0], 1); + ASSERT_EQ(s.Match("oobar", &v), false); + ASSERT_EQ(v.size(), 0); + } TEST(Set, UnanchoredFactored) {