我对正则表达式非常熟悉,但我对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;替换匹配。我在这里做错了什么?
答案 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';