【问题标题】:C++ regex - replacing substring in charC++ 正则表达式 - 替换 char 中的子字符串
【发布时间】:2014-05-13 03:43:53
【问题描述】:

我编写了以下函数来替换 char 中的子字符串。这种方式涉及转换为 std::string 然后转换回 const char。这是最有效的方法还是我可以在没有这种转换甚至更好的方法的情况下做到这一点?!

    const char* replaceInString(const char* find, const char* str, const char* replace)
    {
        std::string const text(str);
        std::regex const reg(find);
        std::string const newStr = std::regex_replace(text, reg, replace);

        //Convert back to char
        char *newChar = new char[newStr.size() + 1];
        std::copy(newStr.begin(), newStr.end(), newChar);
        newChar[newStr.size()] = '\0'; // terminating 0

        return newChar;
    }


    const char* find = "hello";
    const char* replace = "goodbye";
    const char* oldStr = "hello james";

    const char* newStr = m->replaceInString(find, oldStr, replace);

【问题讨论】:

  • 使用const char *有什么特别的原因吗?
  • 明显的替代方案:始终使用std::string

标签: c++ regex char constants


【解决方案1】:

假设您希望从 .c 文件中调用函数,您可以使用 strdup(参见下面的代码)。

#include <string>
#include <regex>
#include <cstdio>
#include <cstdlib>

char* replaceInString(char const *find, char const *str, char const *replace)
{
  return strdup(std::regex_replace(std::string(str), std::regex(find), replace).c_str());
}

int main()
{
  char *newStr = replaceInString("hello", "hello james", "goodbye");
  printf("newStr = %s\n", newStr);
  free(newStr);

  return 0;
}

但请注意,完成后您必须释放返回的内存。

否则,正如@jerry-coffin 建议的那样,一直使用std::string(参见下面的代码):

#include <string>
#include <regex>
#include <iostream>

std::string replaceInString(std::string const &find, std::string const &str, std::string const &replace)
{
  return std::regex_replace(std::string(str), std::regex(find), replace);
}

int main()
{
  std::string str = replaceInString(std::string("hello"), std::string("hello james"), std::string("goodbye"));
  std::cout << str << std::endl;
  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多