Это происходит потому, что '
в конце строки захвачено в группе 3:
((^| )')|('($| ))
|| 2 | |
| 1 | | | 4 |
| 3 |
Вы можете ссылаться на каждую из групп с помощью $1
, $2
, $3
и $4
и более, вы даже можете ссылаться на весь матч, используя $&
запасные обратные ссылки .
Таким образом, добавление $3
может решить проблему:
s = std::regex_replace(s, std::regex("((^| )')|('($| ))"), "$1$3(Quotation, )");
// => '(Quotation, )I'd go.' (Quotation, )
См. Демоверсию C ++
Альтернативное решение может выглядеть как
s = std::regex_replace(s, std::regex("(?:^|\\s)'|'(?!\\S)"), "$&(Quotation, )");
(?:^|\s)'|'(?!\S)
регулярных выражений
(?:^|\s)'
- начало строки или символа пробела и '
после них
|
- или
'(?!\S)
- '
, за которым следует пробел или конец строки.
$&
вставляет совпадение обратно в результат после замены. См. regex demo онлайн (не обращайте внимания на замену, сайт не поддерживает $&
обратная ссылка).
ПРИМЕЧАНИЕ. Если вы используете последний компилятор, вы можете использовать необработанные строковые литералы при определении регулярных выражений, R"((?:^|\\s)'|'(?!\\S))"
.