diff --git a/src/Regex.cpp b/src/Regex.cpp index c67a4648..3ff47970 100644 --- a/src/Regex.cpp +++ b/src/Regex.cpp @@ -37,6 +37,8 @@ FindRegexMatch::FindRegexMatch(const boost::regex ®exImpl, const std::string if (i->matched) { RegexSubmatch s = {*i, i->first - expression.begin()}; submatches.push_back(s); + } else { + submatches.push_back(RegexSubmatch()); } } } diff --git a/tests/unit/RegexTest.cpp b/tests/unit/RegexTest.cpp index 8fa97d61..a618ba16 100644 --- a/tests/unit/RegexTest.cpp +++ b/tests/unit/RegexTest.cpp @@ -46,6 +46,22 @@ TEST(RegexTest, matchesRegexWithSubmatches) { EXPECT_EQ("69", match->getSubmatches()[1].value); } +TEST(RegexTest, matchesRegexWithOptionalSubmatches) { + Regex sum("^(\\d+)\\+(\\d+)(?:\\+(\\d+))?=(\\d+)$"); + + shared_ptr match(sum.find("1+2+3=6")); + EXPECT_TRUE(match->matches()); + ASSERT_EQ(4, match->getSubmatches().size()); + + match = shared_ptr(sum.find("42+27=69")); + EXPECT_TRUE(match->matches()); + ASSERT_EQ(4, match->getSubmatches().size()); + EXPECT_EQ("42", match->getSubmatches()[0].value); + EXPECT_EQ("27", match->getSubmatches()[1].value); + EXPECT_EQ("", match->getSubmatches()[2].value); + EXPECT_EQ("69", match->getSubmatches()[3].value); +} + TEST(RegexTest, findAllDoesNotMatchIfNoTokens) { Regex sum("([^,]+)(?:,|$)"); shared_ptr match(sum.findAll(""));