首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >替换字符串中的单词,但忽略引号中的单词

替换字符串中的单词,但忽略引号中的单词
EN

Stack Overflow用户
提问于 2020-01-22 12:59:34
回答 3查看 130关注 0票数 3

我用以下循环替换字符串content中的单词:

代码语言:javascript
复制
std::string content = "This is original. \"This is original\"";

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

有一个简单的方法,不把“原”改为“替换”时,它的内部引号?

所以就这样吧。

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

将改为:

这是替代品。“这是原创的”

取而代之的是:

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

EN

回答 3

Stack Overflow用户

发布于 2020-01-22 14:59:40

这样做的目的是先搜索要替换的单词或开头的引号。

如果是开头引号,则搜索结束引号,然后继续替换它们。

std::string::find允许您指定搜索的起始位置。

结果可能有点像这样:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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

票数 1
EN

Stack Overflow用户

发布于 2020-01-22 13:06:21

快速修正,但只对第一个字内引号,如果你有相同的词前面,它不会取代它。

示例

代码语言:javascript
复制
#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;
}
票数 0
EN

Stack Overflow用户

发布于 2020-01-22 15:14:05

好的,我写了代码,这是我想要的。

代码语言:javascript
复制
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;

谢谢你的帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59860347

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档