C++ Boost xpressive regex导致垃圾字符

C++ Boost xpressive regex导致垃圾字符,c++,regex,boost,C++,Regex,Boost,我试图编写一些代码,将“/path/file.extension”之类的字符串更改为另一个指定的扩展名。我正在尝试使用boost::xpressive来实现这一点。但是,我有问题。输出中似乎出现了一个垃圾字符: #include <iostream> #include <boost/xpressive/xpressive.hpp> using namespace boost::xpressive; using namespace std; int main() {

我试图编写一些代码,将“/path/file.extension”之类的字符串更改为另一个指定的扩展名。我正在尝试使用boost::xpressive来实现这一点。但是,我有问题。输出中似乎出现了一个垃圾字符:

#include <iostream>
#include <boost/xpressive/xpressive.hpp>

using namespace boost::xpressive;
using namespace std;


int main()
{
    std::string str( "xml.xml.xml.xml");
    sregex date = sregex::compile( "(\\.*)(\\.xml)$");

    std::string format( "\1.zipxml");


    std::string str2 = regex_replace( str, date, format );
    std::cout << "str  = " << str << "\n";
    std::cout << "str2 = " << str2 << "\n";

    return 0;
}
在上面的示例中,我将输出重定向到一个文件,并使用cat打印出不可打印的字符。注意str2中的ctrl-A

不管怎样,我是否使用了boost库?这是一个增强bug吗?是否有另一个正则表达式可以让我用其他字符串替换“.tail”?(在我的示例中,它是固定的。)


谢谢。

至少在我读东西的时候,罪魁祸首就在这里:
std::string format(“\1.zipxml”)

您忘了避开反斜杠,因此
\1
给您一个控件-a。您几乎肯定想要
\\1


或者(如果您的编译器足够新),您可以使用原始字符串来代替,因此它类似于:
R”(\1.zipxml)
,并且您不必逃避反斜杠。我可能不会费心提及这一点,除非你在C++字符串中写REs,原始字符串几乎是你最好的朋友(IMO,无论如何)。

< P>至少在我阅读的时候,罪魁祸首就在这里:<代码> STD::字符串格式(“1。.ZIPXML”);<代码>

您忘了避开反斜杠,因此
\1
给您一个控件-a。您几乎肯定想要
\\1


或者(如果您的编译器足够新),您可以使用原始字符串来代替,因此它类似于:
R”(\1.zipxml)
,并且您不必逃避反斜杠。我可能不会费心提及这一点,除非事实上,如果你在C++字符串中写REs,原始字符串几乎是你的新好友(IMO,无论如何)。

< P>正如Jerry Coffin指出的那样。我犯了个愚蠢的错误

错误代码如下所示:

std::string format( "\1.zipxml");
这应替换为:

std::string format( "$1.zipxml");

谢谢大家的帮助。

正如杰瑞·科芬向我指出的那样。我犯了个愚蠢的错误

错误代码如下所示:

std::string format( "\1.zipxml");
这应替换为:

std::string format( "$1.zipxml");

谢谢大家的帮助。

Hmmm。。。。我试过了,但没用。相反,str2是“xml.xml.xml\1.zipxml”好的,我解决了我的问题,谢谢你的帮助。我用$1代替了\1。你对“jigger”的建议是,我的代码中有一部分是我需要的线索。非常感谢。六羟甲基三聚氰胺六甲醚。。。。我试过了,但没用。相反,str2是“xml.xml.xml\1.zipxml”好的,我解决了我的问题,谢谢你的帮助。我用$1代替了\1。你对“jigger”的建议是,我的代码中有一部分是我需要的线索。非常感谢。