Преглед на файлове

LibRegex: Allow the pattern to match the zero-length end of the string

...only if Multiline is not enabled.
Fixes #11940.
Ali Mohammad Pur преди 3 години
родител
ревизия
9eccd4c56e
променени са 2 файла, в които са добавени 5 реда и са изтрити 1 реда
  1. 1 0
      Tests/LibRegex/Regex.cpp
  2. 4 1
      Userland/Libraries/LibRegex/RegexMatcher.cpp

+ 1 - 0
Tests/LibRegex/Regex.cpp

@@ -683,6 +683,7 @@ TEST_CASE(ECMA262_match)
         { "[\\01]"sv, "\1"sv, true, ECMAScriptFlags::BrowserExtended },
         { "(\0|a)"sv, "a"sv, true }, // #9686, Should allow null bytes in pattern
         { "(.*?)a(?!(a+)b\\2c)\\2(.*)"sv, "baaabaac"sv, true }, // #6042, Groups inside lookarounds may be referenced outside, but their contents appear empty if the pattern in the lookaround fails.
+        { "a|$"sv, "x"sv, true, (ECMAScriptFlags)regex::AllFlags::Global }, // #11940, Global (not the 'g' flag) regexps should attempt to match the zero-length end of the string too.
     };
     // clang-format on
 

+ 4 - 1
Userland/Libraries/LibRegex/RegexMatcher.cpp

@@ -224,7 +224,10 @@ RegexResult Matcher<Parser>::match(Vector<RegexStringView> const& views, Optiona
             }
         }
 
-        for (; view_index < view_length; ++view_index) {
+        for (; view_index <= view_length; ++view_index) {
+            if (view_index == view_length && input.regex_options.has_flag_set(AllFlags::Multiline))
+                break;
+
             auto& match_length_minimum = m_pattern->parser_result.match_length_minimum;
             // FIXME: More performant would be to know the remaining minimum string
             //        length needed to match from the current position onwards within