Advance past the whole codepoint after a zero-width regex match (#3586)

This commit is contained in:
WinkleMad authored and GitHub committed 2026-07-19 21:13:51 +09:00
1 parent dbcaa9d491
commit f1f39b42e3
2 files changed
+21 -2

No files matched your search

+8 -2
View File
@@ -1086,8 +1086,14 @@ static jv f_match(jq_state *jq, jv input, jv regex, jv modifiers, jv testmode) {
onig_foreach_name(reg, f_match_name_iter, &captures);
match = jv_object_set(match, jv_string("captures"), captures);
result = jv_array_append(result, match);
// ensure '"qux" | match("(?=u)"; "g")' matches just once
start = (const UChar*)(input_string+region->end[0]+1);
// ensure '"qux" | match("(?=u)"; "g")' matches just once; advance the
// search start past the whole codepoint, not a single byte, so we don't
// land in the middle of a multibyte character (which would yield a
// spurious duplicate match at the same offset).
start = (const UChar*)(input_string + region->end[0] +
((size_t)region->end[0] < length
? jvp_utf8_decode_length(input_string[region->end[0]])
: 1));
continue;
}
+13
View File
@@ -11,6 +11,19 @@
"ab"
[{"offset":0,"length":0,"string":"","captures":[]},{"offset":1,"length":0,"string":"","captures":[]},{"offset":2,"length":0,"string":"","captures":[]}]
# global zero-width matches must not land inside a multibyte character
[match(""; "g") | .offset]
"aé€🚀b"
[0,1,2,3,4,5]
gsub(""; "-")
"aé"
"-a-é-"
[splits("")]
"aé"
["","a","é",""]
[match("a"; "gi")]
"āáàä"
[]