替换字符串中的单词,但忽略引号中的单词
Replacing words in string, but ignore those in quotes
我用这个循环替换字符串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;
}
相关文章:
- 从字符串变量中逐字符读取单词
- 使用std::mt19937从字符串中返回一个随机单词
- C++-字符串是否包含一个带有简单循环的单词
- 在C++中查找(奇怪的)字符串中的单词
- 当字符串是某个单词时给出输出?
- 替换字符串中的单词,但忽略引号中的单词
- 替换字符串位置 X 中的单词C++
- 视觉C++使用 map 来比较字符串中的每个单词
- 给定一个单词数组和一个字符串,如何计算给定字符串中的所有单词
- 输出返回编号。等于输入字符串的单词的字符串数
- 在字符串的每个单词的末尾插入字符串
- 分析字符串中的双精度和单词
- 如何使用运算符>>在自定义字符串中输入多个单词?
- 反转字符串中单词的位置,而不更改 O(1) 空格限制中特殊字符的顺序
- 使用正则表达式c++从单词和分隔符之间的字符串中提取所有子字符串
- 从文件 (C++) 输入两个单词字符串
- 在一行中输入具有其他输入类型的多个单词字符串
- 打印以 "a" 开头的单词(字符串中)
- 如何让我的代码以不会切断单词(字符串)的方式运行?
- 句子变成单词c++字符串