0

我正在尝试编写一些代码,将“/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;
}

现在编译并运行它:

[bitdiot@kantpute foodir]$ g++ badregex.cpp
[bitdiot@kantpute foodir]$ ./a.out > output
[bitdiot@kantpute foodir]$ less output
[bitdiot@kantpute foodir]$ cat -vte output
str  = xml.xml.xml.xml$
str2 = xml.xml.xml^A.zipxml$

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

无论如何,我是否错误地使用了 boost 库?这是一个提升错误吗?是否有另一个正则表达式可以让我用其他字符串替换“.tail”?(在我的示例中已修复。)

谢谢。

4

2 回答 2

3

至少在我阅读的时候,罪魁祸首就在这里:std::string format( "\1.zipxml");.

你忘了转义反斜杠,所以\1给你一个控制-A。你几乎肯定想要\\1

或者(如果您的编译器足够新)您可以改用原始字符串,因此它类似于: R"(\1.zipxml)",并且您不必转义反斜杠。我可能不会费心提及这一点,除了如果你用 C++ 字符串编写 RE,那么原始字符串几乎是你最好的新朋友(无论如何,IMO)。

于 2013-02-06T15:15:23.837 回答
1

正如杰里科芬向我指出的那样。这是我的一个愚蠢的错误。

错误代码如下:

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

这应该替换为:

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

谢谢大家的帮助。

于 2013-02-06T15:32:47.227 回答