自动替换字符串流中的字符

Posted

技术标签:

【中文标题】自动替换字符串流中的字符【英文标题】:automatically replace characters in stringstream 【发布时间】:2017-04-28 06:13:57 【问题描述】:

在我用字符串内容填充ostringstream 后,我正在寻找一种替换字符的方法,但是只有一些非常低效的解决方案可以提取string,对其进行修改并将其放回@ 987654323@.

现在我想知道是否有一种方法可以在我添加字符串时自动替换这些字符。例如

ostringstream my_json;
my_json << replace_singlequotes;  # modify the stringsteam once
my_json << "'this':";
my_json << " 'is valid JSON'";
std::cout << my_json.str();

output:
"this": "is valid JSON"

您能否为ostringstream 编写一个自定义过滤器,类似于std::hex 等格式修饰符,它会在将给定字符串传送到流中之前对其进行修改?

或者除了按照其他问题和操作指南中的建议在my_json.str() 上运行std::replace() 之外,还有其他方法可以替换ostringstream 中的字符吗?

【问题讨论】:

我觉得第二个代码 sn-p 会比第一个代码对你更有帮助。 注意:如果只是写json的方式比转义引号更简单,可以使用原始字符串:R"("this": "is valid JSON")" 【参考方案1】:

您可以为此目的使用用户定义的操纵器。请看下面的例子:

#include <iostream>
#include <sstream>

class replace_singlequotes 
    friend std::ostream& operator<<(std::ostream &, const replace_singlequotes &);
private:
    std::string str;
public:
    replace_singlequotes(std::string);
;

replace_singlequotes::replace_singlequotes(std::string str) 
    this->str = str;


std::ostream& operator<<(std::ostream& os, const replace_singlequotes &value) 
    std::string result = value.str;
    for (int i = 0; i < result.length(); i++) 
        if (result.at(i) == '\'') 
            result.at(i) = '\"';
        
    
    os << result;
    return os;


int main() 
    std::ostringstream my_json;
    my_json << replace_singlequotes("'this': 'is valid JSON'");
    std::cout << my_json.str() << std::endl;
    return 0;

输出如下:

"this": "is valid JSON"

更新:这是使用运算符重载概念的另一种方法:

#include <iostream>
#include <sstream>

class String 
private:
    std::string value;
public:
    String operator=(const std::string value);
    friend std::ostream & operator<< (std::ostream &out, String const &str);
    friend std::istream& operator>>(std::istream& in, String &str);
;

std::ostream & operator<<(std::ostream &out, const String &str) 
    std::string result = str.value;
    for (int i = 0; i < result.length(); i++) 
        if (result.at(i) == '\'') 
            result.at(i) = '\"';
        
    
    out << result;
    return out;


std::istream& operator>>(std::istream& in, String &str) 
    in >> str.value;
    return in;


String String::operator=(const std::string value) 
    this->value = value;
    return *this;


int main() 
    std::stringstream out;
    String str;

    str = "'this': 'is valid JSON'";
    out << str;

    std::cout<<out.str();
    return 0;

注意:

上述程序也会产生与"this": "is valid JSON"相同的输出 在这里,好处是可以使用insertion operator (&lt;&lt;) 直接用双引号替换单引号。 上面的代码sn-p使用了运算符重载的概念,而 最初的示例是使用用户定义的操纵器。

如果您想使用replace_singlequotes 作为操纵器并且 如果您想将重载概念与此结合,我建议 请按照以下步骤操作:

    在 类。 设为static。 检查标志值是否为true/false 并决定是否有 在插入运算符的重载主体中用双引号替换单引号 (&lt;&lt;)。

【讨论】:

你不能只提供一个函数string replace_singlequotes(string s) replace(s.begin(), s.end(), '\'', '"'); return s; 来实现与第一个示例相同的结果吗?问题是你必须每次都写replace_singlequote(&lt;intput&gt;)而不是修改stringstream的状态。 是的。你可以。但这不会展示操纵器的示例。但是如果你看第二个例子,你将永远不必写replace_singlequote(&lt;intput&gt;),因为插入运算符的定义本身会处理这个问题。

以上是关于自动替换字符串流中的字符的主要内容,如果未能解决你的问题,请参考以下文章

thinkphp中怎样替换字符串

正则表达式用 JQuery ui 自动完成替换某些字符

在 FOR 循环批处理语法中使用变量进行字符串替换

用 cURL 命令中的变量替换字符串 [重复]

java字符串替换repalce方法实现

sql怎么替换字符串中的某个字符