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

标签 c++ string replace

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

std::string content = "This is original. \"This is original\"";

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

有没有一种简单的方法可以在“original”内部引号时不将“original”替换为“replacement”?

例如。

This is original. "This is original"

将替换为:

This is replacement. "This is original"

而不是关闭:

This is replacement. "This is 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

关于c++ - 替换字符串中的单词,但忽略引号中的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59860347/

相关文章:

python - 在 Python 中将字符串拆分为列表(但不分隔相邻数字)

javascript - 使用 javascript 的替换通配符来更改字符串内的宽度属性

c - Bash 将脚本参数插入字符串

c++ - 使用/std :c++latest (or C++17/N4190) 使用 MSVC2015 编译 boost

c++ - 如何直接从 char* 数组创建 std::string 而无需复制?

c++ - 使用 expat 解析 & 符号失败。 token 无效?

java 8中的字符串占用内存较少

python - 获取项目列表并将每个项目的值显示为字符串

c - 用向右移动 'k' 次的单词替换文本中的每个单词

c++ - 在没有它们的笔记本电脑上创建 Alt 代码