regex_replace, почему он теряет 1 доллар? - PullRequest
0 голосов
/ 28 июня 2018
string s = " 'I'd go.' ";
s = std::regex_replace(s, std::regex("((^| )')|('($| ))"), "$1(Quotation, )");
cout << s; // '(Quotation, )I'd go.(Quotation, )

Я хочу заменить ' на (Quotation, ), и я не хочу потерять оригинал '. Итак, я использую $1 для обозначения оригинала '. И я не хочу заменять ' из I'd.

^ означает, что если ' находится в начале строки, он будет заменен. $ означает конец строки.

Результат должен быть:

'(Цитата,) Я бы пошел. (Цитата,)

Но на самом деле результат

'(Цитата,) Я бы пошел. (Цитата,)

Замена левой цитаты работает нормально, но правая теряет '. Почему?

Ответы [ 2 ]

0 голосов
/ 28 июня 2018

Вам не нужно несколько 'или в вашем регулярном выражении. Попробуйте это: ^\s*(').*(')\s*$ и заменить обратные ссылки.

0 голосов
/ 28 июня 2018

Это происходит потому, что ' в конце строки захвачено в группе 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))".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...