Find/replace (?-si)(?::\s*"|(?<!%)%\d*[dsf]|(?!\A)\G)\K((?:(?!(?:(?<!%)%\d*[dsf]|")).)*) with \U\1\E.
Note that this won’t actually convert all your text to upper-case, because some of it (the %s format specifiers) will probably cause bugs downstream if it is capitalized. This regex is very careful to avoid capitalizing format specifiers, which is a lot of why it looks (and is, TBH) so hairy.
My regex doesn’t handle all the possible syntax surrounding format specifiers, because I don’t have 3 hours to spend enumerating and debugging each weird edge case, but it should be fine assuming that all the strings are values in dictionaries. The find-regex becomes the absolutely abhorrent (?-si)(?:"|(?<!%)%\d*[dsf]|(?!\A)\G)\K(?=[^"]*"\s*[,\]\}])((?:(?!(?:(?<!%)%\d*[dsf]|")).)*) in the case where the strings can be strings in arrays or values in dictionaries.
Test text:
{ "a.b": "caps %02d %5s %d %03fnocaps %%02dcaps", "b.c.d": "%%caps %3sap %s cap" }Expected output:
{ "a.b": "CAPS %02d %5s %d %03fNOCAPS %%02DCAPS", "B.C.D": "%%CAPS %3sAP %s CAP" }If you’re absolutely sure you want to capitalize everything that’s not a key, just use this much simpler regex-replace: "\s*:\s*"[^"]*"