diff --git a/include/boost/regex/v4/basic_regex_creator.hpp b/include/boost/regex/v4/basic_regex_creator.hpp index 373c79f1..a45b382c 100644 --- a/include/boost/regex/v4/basic_regex_creator.hpp +++ b/include/boost/regex/v4/basic_regex_creator.hpp @@ -765,7 +765,7 @@ void basic_regex_creator::create_startmaps(re_syntax_base* state) { // Oops error: if(0 == this->m_pdata->m_status) // update the error code if not already set - this->m_pdata->m_status = boost::regex_constants::error_brack; + this->m_pdata->m_status = boost::regex_constants::error_bad_pattern; // // clear the expression, we should be empty: // @@ -776,8 +776,8 @@ void basic_regex_creator::create_startmaps(re_syntax_base* state) // if(0 == (this->flags() & regex_constants::no_except)) { - std::string message = this->m_pdata->m_ptraits->error_string(boost::regex_constants::error_brack); - boost::regex_error e(message, boost::regex_constants::error_brack, 0); + std::string message = this->m_pdata->m_ptraits->error_string(boost::regex_constants::error_bad_pattern); + boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0); e.raise(); } } diff --git a/include/boost/regex/v4/basic_regex_parser.hpp b/include/boost/regex/v4/basic_regex_parser.hpp index 01a97b52..6fc25dc2 100644 --- a/include/boost/regex/v4/basic_regex_parser.hpp +++ b/include/boost/regex/v4/basic_regex_parser.hpp @@ -766,6 +766,7 @@ bool basic_regex_parser::parse_repeat(std::size_t low, std::size_ case syntax_element_soft_buffer_end: case syntax_element_restart_continue: case syntax_element_jump: + case syntax_element_startmark: // can't legally repeat any of the above: fail(regex_constants::error_badrepeat, m_position - m_base); return false; @@ -1744,6 +1745,9 @@ bool basic_regex_parser::parse_perl_extension() } break; } + case regex_constants::syntax_close_mark: + fail(regex_constants::error_badrepeat, m_position - m_base); + return false; default: // // lets assume that we have a (?imsx) group and try and parse it: diff --git a/test/regress/basic_tests.cpp b/test/regress/basic_tests.cpp index 2c552542..2c248fc0 100644 --- a/test/regress/basic_tests.cpp +++ b/test/regress/basic_tests.cpp @@ -129,6 +129,10 @@ void test_partial_match() TEST_REGEX_SEARCH("[\\x0-\\xff]{4,}", perl, "xxa", match_default|match_partial, make_array(0, 3, -2, -2)); TEST_REGEX_SEARCH("a{4,}", perl, "aaa", match_default|match_partial, make_array(0, 3, -2, -2)); TEST_REGEX_SEARCH("\\w{4,}", perl, "aaa", match_default|match_partial, make_array(0, 3, -2, -2)); + TEST_REGEX_SEARCH(".*?", perl, "aaa", match_default|match_partial, make_array(0, 3, -2, -2)); + TEST_REGEX_SEARCH("a*?", perl, "aaa", match_default|match_partial, make_array(0, 3, -2, -2)); + TEST_REGEX_SEARCH("\\w*?", perl, "aaa", match_default|match_partial, make_array(0, 3, -2, -2)); + TEST_REGEX_SEARCH("(\\w)*?", perl, "aaa", match_default|match_partial, make_array(0, 3, -2, -2)); } void test_nosubs() diff --git a/test/regress/test_simple_repeats.cpp b/test/regress/test_simple_repeats.cpp index 684d2d99..04dfbf71 100644 --- a/test/regress/test_simple_repeats.cpp +++ b/test/regress/test_simple_repeats.cpp @@ -39,6 +39,65 @@ void test_simple_repeats() TEST_REGEX_SEARCH("\\*", perl, "*", match_default, make_array(0, 1, -2, -2)); TEST_REGEX_SEARCH("(ab)*", perl, "abab", match_default, make_array(0, 4, 2, 4, -2, 4, 4, -2, -2)); + TEST_INVALID_REGEX("(*)", perl); + TEST_INVALID_REGEX("(*)", extended); + TEST_INVALID_REGEX("\\(*\\)", basic); + TEST_INVALID_REGEX("^*", perl); + TEST_INVALID_REGEX("^*", extended); + TEST_INVALID_REGEX("$*", perl); + TEST_INVALID_REGEX("$*", extended); + TEST_INVALID_REGEX("$*", basic); + TEST_INVALID_REGEX("\\b*", perl); + TEST_INVALID_REGEX("\\B*", perl); + TEST_INVALID_REGEX("\\A*", perl); + TEST_INVALID_REGEX("\\z*", perl); + TEST_INVALID_REGEX("\\Z*", perl); + TEST_INVALID_REGEX("\\A*", perl); + TEST_INVALID_REGEX("a|*", perl); + TEST_INVALID_REGEX("a|*", extended); + TEST_INVALID_REGEX("(+)", perl); + TEST_INVALID_REGEX("(+)", extended); + TEST_INVALID_REGEX("^+", perl); + TEST_INVALID_REGEX("^+", extended); + TEST_INVALID_REGEX("$+", perl); + TEST_INVALID_REGEX("$+", extended); + TEST_INVALID_REGEX("\\b+", perl); + TEST_INVALID_REGEX("\\B+", perl); + TEST_INVALID_REGEX("\\A+", perl); + TEST_INVALID_REGEX("\\z+", perl); + TEST_INVALID_REGEX("\\Z+", perl); + TEST_INVALID_REGEX("\\A+", perl); + TEST_INVALID_REGEX("a|+", perl); + TEST_INVALID_REGEX("a|+", extended); + TEST_INVALID_REGEX("(?)", perl); + TEST_INVALID_REGEX("(?)", extended); + TEST_INVALID_REGEX("^?", perl); + TEST_INVALID_REGEX("^?", extended); + TEST_INVALID_REGEX("$?", perl); + TEST_INVALID_REGEX("$?", extended); + TEST_INVALID_REGEX("\\b?", perl); + TEST_INVALID_REGEX("\\B?", perl); + TEST_INVALID_REGEX("\\A?", perl); + TEST_INVALID_REGEX("\\z?", perl); + TEST_INVALID_REGEX("\\Z?", perl); + TEST_INVALID_REGEX("\\A?", perl); + TEST_INVALID_REGEX("a|?", perl); + TEST_INVALID_REGEX("a|?", extended); + TEST_INVALID_REGEX("({1,2})", perl); + TEST_INVALID_REGEX("({1,2})", extended); + TEST_INVALID_REGEX("^{1,2}", perl); + TEST_INVALID_REGEX("^{1,2}", extended); + TEST_INVALID_REGEX("${1,2}", perl); + TEST_INVALID_REGEX("${1,2}", extended); + TEST_INVALID_REGEX("\\b{1,2}", perl); + TEST_INVALID_REGEX("\\B{1,2}", perl); + TEST_INVALID_REGEX("\\A{1,2}", perl); + TEST_INVALID_REGEX("\\z{1,2}", perl); + TEST_INVALID_REGEX("\\Z{1,2}", perl); + TEST_INVALID_REGEX("\\A{1,2}", perl); + TEST_INVALID_REGEX("a|{1,2}", perl); + TEST_INVALID_REGEX("a|{1,2}", extended); + // now try operator + : TEST_REGEX_SEARCH("ab+", perl, "a", match_default, make_array(-2, -2)); TEST_REGEX_SEARCH("ab+", perl, "ab", match_default, make_array(0, 2, -2, -2));