我用以下循环替换字符串content中的单词:
std::string content = "This is original. \"This is original\"";
while (content.find("original") != std::string::npos)
content.replace(content.find("original"), 8, "replacement");有一个简单的方法,不把“原”改为“替换”时,它的内部引号?
所以就这样吧。
这是原创的。“这是原创的”
将改为:
这是替代品。“这是原创的”
取而代之的是:
这是替代品。“这是替代”
发布于 2020-01-22 14:59:40
这样做的目的是先搜索要替换的单词或开头的引号。
如果是开头引号,则搜索结束引号,然后继续替换它们。
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"发布于 2020-01-22 13:06:21
快速修正,但只对第一个字内引号,如果你有相同的词前面,它不会取代它。
#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;
}发布于 2020-01-22 15:14:05
好的,我写了代码,这是我想要的。
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;谢谢你的帮助。
https://stackoverflow.com/questions/59860347
复制相似问题