Вы можете рисковать и использовать более специфические шаблоны регулярных выражений, чтобы соответствовать 1) одному y
или Y
или 3 или более y
/ Y
с или 2) только двум y
/ Y
s:
std::string text = "y yyaa";
std::regex y_re("([^yY%]|^)[yY](?![yY])|[yY]{3,}"); // this is the regex that matches y yyy or more yyyy
std::regex yy_re("([^yY%]|^)[yY]{2}(?![yY])"); // this is the regex that matches only yy- my problem is here
std::string output = "";
output = std::regex_replace(text, yy_re, "$1%y");
output = std::regex_replace(output, y_re, "$1%Y");
std::cout << output << std::endl;
См. онлайн-демонстрацию C ++ .
Вы можете использовать этот подход, даже если порядок замен неизвестен.
Сведения о регулярном выражении
- Соответствие регулярному выражению 1 только один или 3 или более последовательных
y
/ Y
с: ([^yY%]|^)[yY](?![yY])
- Группа 1: начало строки или любой символ, отличный от y
, Y
и %
, затем Y
или y
, а затем y
или Y
не допускаются |
- или [yY]{3,}
- три или более y
/ Y
с
Regex # 2 работает аналогично, просто [yY]{2}
соответствует только двум y
или Y
символам.
Замена содержит обратную ссылку на значение группы 1 для возврата захваченного символа.