我正在尝试在字符串中查找子字符串,然后将其替换为其他字符串。
我要查找的子字符串具有$ +数字格式。
例如$1250
,$512
,$0
等。
我想从字符串中检测这些子字符串,然后将其替换为其他字符串。
我的代码:
#include <iostream>
void replaceDollarNumber(std::string &str, std::string replace)
{
size_t pos;
while ((pos = str.find('$')) != std::string::npos)
{
size_t len = pos + 1;
while (len < str.length() && isdigit(str[len]))
{
len++;
}
str.erase(pos, --len);
str.insert(pos, replace);
}
}
int main()
{
std::string str = "!$@#$34$1%^&$5*$1$!%$91$12@$3";
replaceDollarNumber(str, "<>");
std::cout << "Result : " << str << '\n';
}
我期望的结果:
Result : !$@#<><>%^&<>*<>$!%<><>@<>
我得到的结果:
Result : !<>@#<>&<>91<>
如何纠正replaceDollarNumber
函数,以便获得所需的结果?
此外,我想知道是否还有更好的解决方案。
编辑:我也想知道如何不使用正则表达式
答案 0 :(得分:3)
使用正则表达式的工作示例,使用g++ -std=c++11 test.cpp
进行编译:
#include <iostream>
#include <string>
#include <regex>
std::string replaceDollarNumber(std::string str, std::string replace)
{
std::regex long_word_regex("(\\$[0-9]+)");
std::string new_s = std::regex_replace(str, long_word_regex, replace);
return new_s;
}
int main()
{
std::string str = "!$@#$34$1%^&$5*$1$!%$91$12@$3";
auto new_s = replaceDollarNumber(str, "<>");
std::cout << "Result : " << new_s << '\n';
}
答案 1 :(得分:0)
代码有两个问题。首先,basic_string::erase
的第二个参数应为要删除的文本的 length ;此函数使用要删除的最后一个字符的索引来调用它。其次,即使找不到数字,代码也会插入替换文本。
解决这两个问题可以解决此问题:
void replaceDollarNumber(std::string &str, std::string replace)
{
size_t pos;
while ((pos = str.find('$')) != std::string::npos)
{
size_t end = pos + 1;
while (end < str.length() && isdigit(str[end]))
{
end++;
}
if (end != pos + 1)
{
str.erase(pos, end - pos);
str.insert(end, replace);
}
}
}
我将len
重命名为end
,以更好地反映其实际含义。
我还没有测试代码;我认为end - pos
是正确的,但可能相距一。
最后,我将使用basic_string::replace
而不是erase
和insert
。