c++ - 替换字符串中的单词,但忽略引号中的单词
问题描述
我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") << "\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
推荐阅读
- python - 如何更正此错误 PyPDF2.utils.PdfReadError:无法读取空文件
- docker - Docker Traefik 无法解析 DNS(无法到达服务器并获取证书)
- java - 如何在锁定屏幕上显示的活动中启用屏幕键盘?
- ios - 如何从自定义 macOS 文本共享扩展中获取文本?
- c# - REST API - 使用 ETag 进行并发检查
- python - 为什么我在 Google Kickstart 的在线评分器中出现运行时错误,但在我自己的 IDE 中却没有?
- android - 如何自定义 Nougat TimePicker 对话框?
- python-3.x - 当我尝试调试 kivy 应用程序时,buidozer 显示错误
- c - 表达式 c = a>2+b!=6 的输出是什么?
- javascript - Safari 中的垂直对齐有奇怪的行为