首页 > 解决方案 > 替换字符串中的单词,但忽略引号中的单词

问题描述

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

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

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

有没有一种简单的方法可以在引号内不将“原始”替换为“替换”?

所以例如。

这是原创的。“这是原创”

将被替换为:

这是替换。“这是原创”

而是关闭:

这是替换。“这是替代品”

标签: c++stringreplace

解决方案


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

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

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


推荐阅读