使用boost :: regex替换带有双反斜杠的反斜杠和带有斜杠引号的双引号

时间:2012-07-12 22:06:37

标签: regex boost backslash

我要努力让它发挥作用。这是我到目前为止所拥有的,但是çanemarche pas。

const std::string singleslash("\\\\\\\\");
const std::string doublequote("\\\"\"\\");
const std::string doubleslash("\\\\\\\\\\\\");
const std::string slashquote("\\\\\\\\\"\\");

std::string temp(Variables);
temp.assign(boost::regex_replace(temp,boost::regex(singleslash),doubleslash,boost::match_default));
temp.assign(boost::regex_replace(temp,boost::regex(doublequote),slashquote,boost::match_default));

有人请救救我。

更新似乎我没有正确使用regex_replace。这是一个更简单的例子,它不起作用......

std::string w("Watermelon");
temp.assign(boost::regex_replace(w,boost::regex("W"),"x",boost::match_all | boost::format_all));
MessageBox((HWND)Window, temp.c_str(), "temp", MB_OK);

这给了我“西瓜”而不是“西瓜”

更新2 使用boost :: regex错误...这个工作

boost::regex pattern("W");
temp.assign(boost::regex_replace(w,pattern,std::string("x")));

更新3 以下是最终有效的内容

std::string w("Watermelon wishes backslash \\ and another backslash \\ and \"\"fatness\"\"");
temp.assign(w);

MessageBox((HWND)Window, temp.c_str(), "original", MB_OK);

const boost::regex singlebackslashpat("\\\\");
const std::string doublebackslash("\\\\\\\\");
temp.assign(boost::regex_replace(w,singlebackslashpat,doublebackslash));
MessageBox((HWND)Window, temp.c_str(), "double-backslash", MB_OK);

const boost::regex doublequotepat("\"\"");
const std::string backslashquote("\\\\\\\"");
temp.assign(boost::regex_replace(temp,doublequotepat,backslashquote));
MessageBox((HWND)Window, temp.c_str(), "temp", MB_OK);

2 个答案:

答案 0 :(得分:3)

所以,我不是一个boost :: regex专家,并且没有在我现在的地方安装Boost,但让我们一步一步地尝试这个。

匹配的模式

要匹配输入中的双引号,您只需要在正则表达式中使用双引号(双引号在正则表达式中不是神奇的),这意味着您只需要一个包含双引号的字符串。 "\""应该没问题。

要匹配输入中的反斜杠,您需要在正则表达式中使用转义的反斜杠,这意味着两个连续的反斜杠;每个需要在字符串文字中再次加倍。所以"\\\\"。 [编辑:我之前输了八个而不是四个,这是一个错误。]

输出格式

同样,双引号在匹配替换格式(或任何正确的术语)中并不神奇,但反斜杠是。因此,要在输出中获得两个反斜杠,您需要在字符串中使用四个反斜杠,这意味着您需要在字符串文字中使用8个反斜杠。所以:"\\\\\\\\"

要获得反斜杠后跟双引号,您的字符串需要是两个反斜杠和一个双引号,并且所有这些都需要在字符串文字中以反斜杠开头。所以:"\\\\\""

[已编辑添加实际代码以便于复制和粘贴:]

const std::string singleslash("\\\\");
const std::string doublequote("\"");
const std::string doubleslash("\\\\\\\\");
const std::string slashquote("\\\\\"");

匹配标记

在阅读了tofutim的更新后,我试图查找match_all并找不到它的文档。但是,它似乎是一个可能的匹配标志值,并且它所定义的头文件旁边有以下神秘注释:“即使设置了match_any,也必须找到整个输入”。 match_any附带的类似含义的评论是“不关心我们匹配的内容”。我不确定这是什么意思,似乎这些标志已被弃用或者其他东西,但无论如何你可能不想使用它们。

(在快速查看源代码之后,我认为match_all只有在输入结束时才会接受匹配。所以您可以尝试替换n而不是在您修改过的测试用例中W,看看是否有效。或者,也许我错过了某些内容并且必须匹配整个输入,您可以通过替换Watermelon代替Wn。或者,如果你不想对此感到好奇,你就无法打扰。)

试一试并报告......

答案 1 :(得分:1)

我在这里没有提升,但单(斜)斜线必须在正则表达式中写为\\,因此c ++字符串文字是四个反向。替换字符串必须在c ++中进行转义,因此它的八个反斜杠。

正则表达式中的双引号不得转义,因此它是“”并且在c ++ \“\”中。再次替换必须被转义,所以它的\\“,当然在c ++中,所以它是\\\\\”。

根据您的更新3,模式和替换字符串必须像这样初始化:

const std::string singleslashpat("\\\\");
const std::string doublequotepat("\"\"");
const std::string doubleslash("\\\\\\\\");
const std::string slashquote("\\\\\"");