Если используемый вами язык поддерживает lookarounds , вы можете использовать их, чтобы удостовериться, что ваш знак вопроса окружен символами слова, но на самом деле их не захватывает:
/(?<=\w)\?(?=\w)/
(?<=\w)
- это взгляд назад (двигатель смотрит "сзади" - перед - потенциальным совпадением), а (?=\w)
- это взгляд вперед (двигатель смотрит в будущее). Lookarounds не фиксируются, поэтому в вашем случае будет только знак вопроса, и тогда вы сможете заменить его.
Например, в PHP вы можете сделать:
$string = "...shut it down?after taking a couple of..."
preg_replace('/(?<=\w)\?(?=\w)/', "—", $string);
// results in ...shut it down—after taking a couple of...
Lookarounds поддерживаются механизмами регулярных выражений на основе PCRE (совместимых с perl), хотя Ruby не поддерживает lookbehinds.