Вы можете сделать это с одним регулярным выражением!
Идея состоит в том, чтобы смотреть вперед и сопоставлять только те слова, за которыми следует "... строка-символов-символов-символов-символов", где "--строка-строк" не содержит ни кавычек, ни сбалансированных пар кавычек.
quotes_re = `
\\w+ # a word
(?= # followed by ..
[^"]* # plain text (possibly empty), and then...
" # a quote, and then...
(
[^"]+ # some plain text
| # or
" [^"]* " # a quoted string
)* # 0 or more times
$ # end of string
)
`;
let regex = (src, flags) =>
new RegExp(src.replace(/#.*|\s+/g, ''), flags);
s = '"this is in quotes" not in quote "more quotes" end end'
console.log('regex', regex(quotes_re, 'g').source)
console.log('result', s.replace(regex(quotes_re, 'g'), '+$&'))
Утилита regex
обеспечивает поддержку подробных регулярных выражений для JS, вы можете получить необработанный источник, зарегистрировав regex(quotes_re, 'g').source