gpt4 book ai didi

c++ - Boost xpressive正则表达式导致垃圾字符

转载 作者:行者123 更新时间:2023-11-27 23:18:54 25 4
gpt4 key购买 nike

我正在尝试编写一些代码,将“/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 库?这是一个 boost 错误吗?是否有另一个我可以使用的正则表达式可以让我用字符串替换“.tail”和其他字符串? (在我的示例中已修复。)

谢谢。

最佳答案

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

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

或者(如果您的编译器足够新)您可以改用原始字符串,因此它类似于:R"(\1.zipxml)",并且您不会逃避你的反斜杠。我可能懒得提这一点,除非你在用 C++ 字符串编写 RE,原始字符串几乎是你最好的新 friend (IMO,无论如何)。

关于c++ - Boost xpressive正则表达式导致垃圾字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14732252/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com