Вы можете заменить все, что предшествует символу слова, левой кавычкой, а все, что следует за символом слова, правой кавычкой.
str = str.replace(/"(?=\w|$)/g, "“");
str = str.replace(/(?<=\w|^)"/g, "”"); // IF the language supports look-
// behind. Otherwise, see below.
Как указано в комментариях ниже, это не учитывает пунктуацию, но легко может:
/(?<=[\w,.?!\)]|^)"/g
[ Редактировать :] Для языков, которые не поддерживают ретроспективный просмотр, таких как Javascript, до тех пор, пока вы сначала замените все фронтальные, у вас есть два варианта:
str = str.replace(/"/g, "”"); // Replace the rest with right curly quotes
// or...
str = str.replace(/\b"/g, "”"); // Replace any quotes after a word
// boundary with right curly quotes
(я оставил оригинальное решение выше на случай, если это будет полезно для кого-то, использующего язык, который поддерживает поиск)