Boost表达式regex会导致垃圾字符

Boost xpressive regex results in garbage character

本文关键字:字符 表达式 regex Boost      更新时间:2023-10-16

我正在尝试编写一些代码,将类似"/path/file.extension"的字符串更改为另一个指定的扩展名。我正在尝试使用boost::expression来做这件事。但是,我遇到了问题。输出中似乎出现了一个垃圾字符:

#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"?(在我的例子中是修复的。)

谢谢。

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

您忘记对反斜杠进行转义,所以1给了您一个control-a。你几乎肯定想要\1

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

正如Jerry Coffin向我指出的,这是我犯的一个愚蠢的错误。

错误代码如下:

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

应将其替换为:

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

谢谢大家的帮助。