C ++ regex_replace不替换字符串

时间:2020-10-30 14:28:11

标签: c++ string

我是C ++的新手。我正在尝试学习字符串替换。

我正在编写一个简短的(应该是一个教程)程序来更改目录名称。

例如,我想用“ / illumina / runs”在目录名的开头更改“ / home”:

#ifdef WINDOWS
#include <direct.h>
#define GetCurrentDir _getcwd
#else
#include <unistd.h>
#define GetCurrentDir getcwd
#endif

#include<iostream>
#include <string>
#include <regex>
#include <iterator>
using namespace std;

std::string get_current_dir() {
   char buff[FILENAME_MAX]; //create string buffer to hold path
   GetCurrentDir( buff, FILENAME_MAX );
   string current_working_dir(buff);
   return current_working_dir;
}

int main() {
   string b2_dir = get_current_dir();
   std::regex_replace(b2_dir, std::regex("^/home"), "/illumina/runs");
   cout << b2_dir << endl;
   return 0;
}

我正在跟踪http://www.cplusplus.com/reference/regex/regex_replace/中的示例,但我不明白为什么它没有改变。

如果我写的没有意义,则Perl等效为$dir =~ s/^\/home/\/illumina\/runs/,如果这样做有助于更好地理解问题

为什么我不告诉我这段代码为什么改变了字符串?如何获取C ++来更改字符串?

1 个答案:

答案 0 :(得分:5)

std::regex_replace不会修改其输入参数。它产生一个新的std::string作为返回值。参见例如此处:https://en.cppreference.com/w/cpp/regex/regex_replace(您的呼叫使用4号重载)。

这应该可以解决您的问题:

b2_dir = std::regex_replace(b2_dir, std::regex("^/home"), "/illumina/runs");