用其他字符串替换美元+数字

时间:2018-08-02 10:27:49

标签: c++ string replace

我正在尝试在字符串中查找子字符串,然后将其替换为其他字符串。

我要查找的子字符串具有$ +数字格式。

例如$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函数,以便获得所需的结果?

此外,我想知道是否还有更好的解决方案。

编辑:我也想知道如何不使用正则表达式

2 个答案:

答案 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而不是eraseinsert