From 56f01a9a419a4c7c6e7a277bf08973ac08265dbc Mon Sep 17 00:00:00 2001 From: itchyny Date: Sun, 9 Jul 2023 15:25:21 +0900 Subject: [PATCH] Fix empty regular expression matches (fix #2565) --- src/builtin.c | 2 +- tests/onig.test | 22 +++++++++++++--------- 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/src/builtin.c b/src/builtin.c index 0fd7554373..3cde686618 100644 --- a/src/builtin.c +++ b/src/builtin.c @@ -1002,7 +1002,7 @@ static jv f_match(jq_state *jq, jv input, jv regex, jv modifiers, jv testmode) { jv_string((char*)ebuf))); break; } - } while (global && start != end); + } while (global && start <= end); onig_region_free(region,1); region = NULL; if (region) diff --git a/tests/onig.test b/tests/onig.test index d49391fc09..fab41703a5 100644 --- a/tests/onig.test +++ b/tests/onig.test @@ -1,12 +1,16 @@ # match builtin [match("( )*"; "g")] "abc" -[{"offset":0, "length":0, "string":"", "captures":[]},{"offset":1, "length":0, "string":"", "captures":[]},{"offset":2, "length":0, "string":"", "captures":[]}] +[{"offset":0, "length":0, "string":"", "captures":[]}, {"offset":1, "length":0, "string":"", "captures":[]}, {"offset":2, "length":0, "string":"", "captures":[]}, {"offset":3, "length":0, "string":"", "captures":[]}] [match("( )*"; "gn")] "abc" [] +[match(""; "g")] +"ab" +[{"offset":0,"length":0,"string":"","captures":[]},{"offset":1,"length":0,"string":"","captures":[]},{"offset":2,"length":0,"string":"","captures":[]}] + [match("a"; "gi")] "āáàä" [] @@ -71,29 +75,29 @@ gsub("a";"b") "aaaaa" "bbbbb" -gsub( "(.*)"; ""; "x") +gsub("(.*)"; ""; "x") "" "" -gsub( ""; "a"; "g") +gsub(""; "a"; "g") "" "a" -gsub( "^"; ""; "g") +gsub("^"; ""; "g") "a" "a" # The following is a regression test and should not be construed as a requirement other than that execution should terminate: -gsub( ""; "a"; "g") +gsub(""; "a"; "g") "a" -"aa" +"aaa" -gsub( "$"; "a"; "g") +gsub("$"; "a"; "g") "a" "aa" -gsub( "^"; "a") +gsub("^"; "a") "" "a" @@ -163,5 +167,5 @@ sub("(?.)"; "\(.x)!") # splits and _nwise [splits("")] "ab" -["","a","b"] +["","a","b",""]