diff --git a/Userland/Libraries/LibRegex/RegexParser.cpp b/Userland/Libraries/LibRegex/RegexParser.cpp index 2d9c8113c0..97f201cae0 100644 --- a/Userland/Libraries/LibRegex/RegexParser.cpp +++ b/Userland/Libraries/LibRegex/RegexParser.cpp @@ -873,26 +873,14 @@ StringView ECMA262Parser::read_digits_as_string(ReadDigitsInitialZeroState initi if (!match(TokenType::Char)) return {}; - if (initial_zero != ReadDigitsInitialZeroState::Allow) { - auto has_initial_zero = m_parser_state.current_token.value() == "0"; - if (initial_zero == ReadDigitsInitialZeroState::Disallow && has_initial_zero) - return {}; - - if (initial_zero == ReadDigitsInitialZeroState::Require && !has_initial_zero) - return {}; - } + if (initial_zero == ReadDigitsInitialZeroState::Disallow && m_parser_state.current_token.value() == "0") + return {}; int count = 0; size_t offset = 0; auto start_token = m_parser_state.current_token; while (match(TokenType::Char)) { auto c = m_parser_state.current_token.value(); - if (follow_policy == ReadDigitFollowPolicy::DisallowDigit) { - if (hex && AK::StringUtils::convert_to_uint_from_hex(c).has_value()) - break; - if (!hex && c.to_uint().has_value()) - break; - } if (follow_policy == ReadDigitFollowPolicy::DisallowNonDigit) { if (hex && !AK::StringUtils::convert_to_uint_from_hex(c).has_value()) @@ -1213,7 +1201,7 @@ bool ECMA262Parser::parse_atom_escape(ByteCode& stack, size_t& match_length_mini } // '\0' - if (read_digits(ReadDigitsInitialZeroState::Require, ReadDigitFollowPolicy::DisallowDigit).has_value()) { + if (try_skip("0")) { match_length_minimum += 1; stack.insert_bytecode_compare_values({ { CharacterCompareType::Char, (ByteCodeValueType)0 } }); return true; @@ -1496,7 +1484,7 @@ bool ECMA262Parser::parse_nonempty_class_ranges(Vector& } // '\0' - if (read_digits(ReadDigitsInitialZeroState::Require, ReadDigitFollowPolicy::DisallowDigit).has_value()) + if (try_skip("0")) return { { .code_point = 0, .is_character_class = false } }; // HexEscape diff --git a/Userland/Libraries/LibRegex/RegexParser.h b/Userland/Libraries/LibRegex/RegexParser.h index dc4e682fd2..3c2df1ad4e 100644 --- a/Userland/Libraries/LibRegex/RegexParser.h +++ b/Userland/Libraries/LibRegex/RegexParser.h @@ -178,11 +178,9 @@ private: enum class ReadDigitsInitialZeroState { Allow, Disallow, - Require, }; enum class ReadDigitFollowPolicy { Any, - DisallowDigit, DisallowNonDigit, }; StringView read_digits_as_string(ReadDigitsInitialZeroState initial_zero = ReadDigitsInitialZeroState::Allow, ReadDigitFollowPolicy follow_policy = ReadDigitFollowPolicy::Any, bool hex = false, int max_count = -1); diff --git a/Userland/Libraries/LibRegex/Tests/Regex.cpp b/Userland/Libraries/LibRegex/Tests/Regex.cpp index 378fef5b13..5138947340 100644 --- a/Userland/Libraries/LibRegex/Tests/Regex.cpp +++ b/Userland/Libraries/LibRegex/Tests/Regex.cpp @@ -538,6 +538,7 @@ TEST_CASE(ECMA262_match) { "^hel(?l.)1$", "hello1" }, { "^hel(?l.)1*\\k.$", "hello1lo1" }, { "^[-a-z1-3\\s]+$", "hell2 o1" }, + { "^[\\0-\\x1f]$", "\n" }, { .pattern = "\\bhello\\B", .subject = "hello1", .options = ECMAScriptFlags::Global }, { "\\b.*\\b", "hello1" }, { "[^\\D\\S]{2}", "1 " },