Заменить совпадение подстроки на регулярное выражение, используя C ++ - PullRequest
1 голос
/ 04 ноября 2019

Я использую std :: string regex_search и std :: string regex_replace, чтобы найти подстроку и заменить. Моя проблема в том, что я не знаю, как выразить это своим регулярным выражением. Когда дело доходит до yy ->% y другой случай, такой как y, yyy, yyyy, yyyyy, и т.д ..->% Y

std::string text = "y yyaa";
std::regex y_re("[yY]+"); // this is the regex that matches y yyy or more yyyy
std::regex yy_re("(?=^y{2}[^y])y{2}"); // this is the regex that matches only yy- my problem is here
std::string output = "";
smatch m;

if (regex_search(text, m, yy_re)) {
    output = std::regex_replace(text, yy_re, "%y");
}
else {
    output = std::regex_replace(text, y_re, "%Y");
}
cout << output << endl;

Мой фактический вывод:

%Y %Yaa

Мой ожидаемый результат:

%Y %yaa

1 Ответ

1 голос
/ 04 ноября 2019

Вы можете рисковать и использовать более специфические шаблоны регулярных выражений, чтобы соответствовать 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 для возврата захваченного символа.

...