替换字符串中的单词,但忽略引号中的单词

Replacing words in string, but ignore those in quotes

本文关键字:单词 字符串 替换      更新时间:2023-10-16

我用这个循环替换字符串content中的单词:

std::string content = "This is original. "This is original"";
while (content.find("original") != std::string::npos)
content.replace(content.find("original"), 8, "replacement");

有没有一种简单的方法可以在其内部引号时不将"原始"替换为"替换"?

所以例如。

这是原创的。"这是原创的">

将替换为:

这是替换。"这是原创的">

而不是关闭:

这是替换。"这是替换"

这个想法是搜索先出现的内容,要替换的单词或开头引号。

如果是开盘引号,则搜索结束引号,并在它们之后继续替换。

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") << "nn";
content += 'n' + content + 'n' + content + 'n' + content;
cout << replace_except_in_quotes(content, "original", "replacement") << "nn";;
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

好的,我编写了我想要的代码。

std::string content = "This is original. "This is original"";
std::string temp, res;
unsigned long n = content.length();
bool instring = false;
for(int i = 0; i < n; ++i)
{
temp = temp + content[i];
if(content[i] == '"' || n == i+1)
{
if(instring)
{
res = res + temp;
temp = "";
} else
{
while (temp.find("original") != std::string::npos)
temp.replace(temp.find("original"), 8, "replacement");
}
res = res + temp;
temp = "";
}
instring = !instring;
}
}
content = res;

感谢您的帮助。

快速修复,但仅适用于引号内的第一个单词,如果您前面有相同的单词,它不会替换它。

样本

#include <iostream>
#include <string>
using namespace std; //for sample purposes

int main() 
{
string content = "this is original. "this is original"";
cout << "Original: " << content << endl;
while (content.find("original") != std::string::npos)
if(content.find('"'))
break;
content.replace(content.find("original"), 8, "replacement");
cout << "Replaced: " << content;
return 0;
}