正则表达式替换文件扩展名前缀放置不起作用 - 替换匹配

时间:2016-09-29 08:54:06

标签: c++ regex c++11 visual-studio-2015

我对正则表达式非常熟悉,但我对C ++ 11 std::regex_replace并不熟悉。我花了一个多小时试图找出如何替换一个简单的文件扩展名,但没有任何工作!

我想要实现的目标非常简单。我想将myfile.pdf替换为myfile.txt。所以我写了我的正则表达式来匹配以.pdf结尾的文件:

std::regex regex("^.*\\.(pdf)$")

关注a reference并跟随cheat-sheet,我希望看到前缀(匹配前的任何内容),所以我使用:

std::string myStr = std::regex_replace(std::string("HiThere.pdf"), regex, std::string("$`"))
std::cout<< myStr <<std::endl;

我得到一个空字符串!这种情况发生了,虽然我得到了一场比赛为了表明我得到了一个匹配,只需替换&#34; $`&#34;使用&#34; $ 1&#34;,您将看到第一个匹配替换整个字符串。

一方面注意,根据所有参考文献,$ 0应该显示整个字符串,但它不会!

我想要达到的目的是用&#34; .txt&#34;替换匹配。我在这里做错了什么?

2 个答案:

答案 0 :(得分:1)

这是正确的行为。 $`是匹配之前的字符串 - 但是你匹配整个字符串! (所以$`是空的。)

我还认为你需要捕捉.*,而不是.pdf(你知道毕竟是什么!)。我想你想要的是:

std::regex regex("^(.*)\\.pdf$")
std::string source("HiThere.pdf");
std::string myStr = std::regex_replace(source, regex, "$1.txt");

甚至:

std::regex regex("\\.pdf$")
std::string source("HiThere.pdf");
std::string myStr = std::regex_replace(source, regex, ".txt");

答案 1 :(得分:0)

“$`”将匹配整个输入字符串,因此将为空 它是匹配的前缀,而不是第一个反向引用。

您可以非常简单地实现目标:

std::regex regex("^(.*)\\.pdf$");
const std::string myStr = std::regex_replace(
   "HiThere.pdf",
   regex,
   "$1.txt"
);
std::cout << myStr << '\n';