Идея состоит в том, чтобы искать то, что стоит на первом месте, слово для замены или открывающие кавычки.
Если это открывающие кавычки, вы ищете закрывающие кавычки и продолжаете замену после них.
std::string::find
позволяет указать начальную позицию поиска.
Результат может выглядеть примерно так:
#include <iostream>
#include <string>
std::string& replace_except_in_quotes(std::string& content, const std::string& original, const std::string& replacement)
{
for(size_t pos = 0U; pos < content.size(); /*incremented in body*/)
{
size_t nextOriginal = content.find(original, pos);
if(nextOriginal == std::string::npos)
{
break;// All occurences replaced
}
size_t nextQuote = content.find('\"', pos);
bool skipQuotes = (nextQuote != std::string::npos) && (nextQuote < nextOriginal);
if(skipQuotes)
{
nextQuote = content.find('\"', nextQuote + 1);
if(nextQuote == std::string::npos)
{
break; // Missing closing quote
}
pos = nextQuote+1;
continue;
}
// Actually replace original with replacement
content.replace(nextOriginal, original.size(), replacement);
pos += replacement.size() + 1;
}
return content;
}
int main()
{
using namespace std;
string content = "this is original.\"this is original\"";
cout << replace_except_in_quotes(content, "original", "replacement") << "\n\n";
content += '\n' + content + '\n' + content + '\n' + content;
cout << replace_except_in_quotes(content, "original", "replacement") << "\n\n";;
return 0;
}
Вывод:
this is replacement."this is original"
this is replacement."this is original"
this is replacement."this is original"
this is replacement."this is original"
this is replacement."this is original"
Годболт: https://gcc.godbolt.org/z/oYq3sy