LibRegex: Correctly parse BRE bracket expressions

Commonly, bracket expressions are in fact, enclosed in brackets.
This commit is contained in:
Ali Mohammad Pur 2021-07-10 22:02:18 +04:30 committed by Ali Mohammad Pur
parent 1c69c686e3
commit 1c584e9d80
Notes: sideshowbarker 2024-07-18 09:24:45 +09:00
2 changed files with 19 additions and 5 deletions

View file

@ -1149,4 +1149,10 @@ TEST_CASE(bre_basic)
EXPECT_EQ(regcomp(&regex, "15{1,2}", REG_NOSUB | REG_ICASE), REG_NOERR);
EXPECT_EQ(regexec(&regex, "15{1,2}", 0, NULL, 0), REG_NOERR);
regfree(&regex);
EXPECT_EQ(regcomp(&regex, "1[56]", REG_NOSUB | REG_ICASE), REG_NOERR);
EXPECT_EQ(regexec(&regex, "15", 0, NULL, 0), REG_NOERR);
EXPECT_EQ(regexec(&regex, "16", 0, NULL, 0), REG_NOERR);
EXPECT_EQ(regexec(&regex, "17", 0, NULL, 0), REG_NOMATCH);
regfree(&regex);
}

View file

@ -481,12 +481,20 @@ bool PosixBasicParser::parse_one_char_or_collation_element(ByteCode& bytecode, s
Vector<CompareTypeAndValuePair> values;
size_t bracket_minimum_length = 0;
if (!AbstractPosixParser::parse_bracket_expression(values, bracket_minimum_length))
return false;
bytecode.insert_bytecode_compare_values(move(values));
match_length_minimum += bracket_minimum_length;
return !has_error();
if (match(TokenType::LeftBracket)) {
consume();
if (!AbstractPosixParser::parse_bracket_expression(values, bracket_minimum_length))
return false;
consume(TokenType::RightBracket, Error::MismatchingBracket);
bytecode.insert_bytecode_compare_values(move(values));
match_length_minimum += bracket_minimum_length;
return !has_error();
}
return set_error(Error::InvalidPattern);
}
// =============================