gpt4 book ai didi

c++ - 除非已经转义,否则如何替换所有出现的字符串或字符?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:40:27 25 4
gpt4 key购买 nike

是否有一种漂亮而优雅的方法(也许使用 boost::algorithm::replace?)来替换字符串中出现的所有字符 - 除非前面有反斜杠?

这样

std::string s1("hello 'world'");
my_replace(s1, "'", "''"); // s1 becomes "hello ''world''"

std::string s2("hello \\'world'"); // note: only a single backslash in the string
my_replace(s2, "'", "''"); // s2 becomes "hello \\'world''"

使用 boost::regex,这可以通过以下方式完成:

std::string my_replace (std::string s, std::string search, std::string format) {
boost::regex e("([^\\\\])" + search);
return boost::regex_replace(s, e, "\\1" + format);
}

但由于性能原因,我不喜欢使用 boost::regex。 boost::algorithm::replace 看起来很合适,但我不知 Prop 体如何。

最佳答案

这是一个完成这项工作的简单算法:

#include <iostream>
#include <string>

using namespace std;

string replace(char c, string replacement, string s)
{
string chars = string("\\") + c;

size_t pos = s.find_first_of(chars);
while (pos != string::npos)
{
char& ch = s[pos];
if (ch == '\\')
{
pos = s.find_first_of(chars, pos + 2);
}
else if (ch == c)
{
s.replace(pos, 1, replacement);
pos = s.find_first_of(chars, pos + replacement.length());
}
}

return s;
}

int main()
{
cout << replace('\'', "''", "hello \\'world'");
}

更新:

按照@BenVoigt 的建议,我重新制定了算法以避免就地操作。这应该会带来进一步的性能 boost :

string replace(char c, string replacement, string const& s)
{
string result;
size_t searchStartPos = 0;

string chars = string("\\") + c;
size_t pos = s.find_first_of(chars);
while (pos != string::npos)
{
result += s.substr(searchStartPos, pos - searchStartPos);
if (s[pos] == '\\')
{
result += string("\\") + c;
searchStartPos = pos + 2;
}
else if (s[pos] == c)
{
result += replacement;
searchStartPos = pos + 1;
}

pos = s.find_first_of(chars, searchStartPos);
}

return result;
}

关于c++ - 除非已经转义,否则如何替换所有出现的字符串或字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14470856/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com