Boost表达式regex会导致垃圾字符
Boost xpressive regex results in garbage character
我正在尝试编写一些代码,将类似"/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)。
错误代码如下:
std::string format( "1.zipxml");
应将其替换为:
std::string format( "$1.zipxml");
谢谢大家的帮助。
相关文章:
- 带有多个字符分隔符的正则表达式
- 为什么一个表达式中的 std::string 连接给出的结果与逐个字符不同的结果?
- 如何称呼表达式"T (&some(...))[2]' 其中 T=字符
- C++ [正则表达式] 如何提取给定的字符值
- C++正则表达式字符类不匹配
- 通过正则表达式拆分字符串会切断结果的第一个字母
- 正则表达式 - 匹配不遵循特定模式的字符
- 如何使用 ASCII 转换使用字符堆栈计算后缀表达式
- 二进制表达式的操作数无效("常量字符*"和"常量字符*")
- 使用具有特殊字符的正则表达式标记 C++ 字符串
- 恒定字符阵列的获取字符串长度函数(strlen)不是恒定表达式
- 正则表达式:从模式字符串 1.string2'string3 中提取字符串,其中字符串 1 可以包含 '." 字符
- 提升正则表达式 cpp 用于查找 %% 之间的字符串,输出不包括 % 字符本身
- 如何使用正则表达式匹配不包含特殊字符(&、\、<、>、|、)的字符串,除非它们以反斜杠开头
- 将一个特定字符替换为正则表达式匹配中的另一个字符
- 修改正则表达式以包含反斜杠和单引号(以便反斜杠表现为转义字符)
- C++正则表达式中的特殊字符
- 使用正则表达式为每个连续的大写字符附加'.'
- C++正则表达式转义标点字符,如"."
- arm-none-eabi-g++ 忽略表达式 stm32f4 中的无效字符"#"