我要努力让它发挥作用。这是我到目前为止所拥有的,但是ç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);
答案 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
代替W
或n
。或者,如果你不想对此感到好奇,你就无法打扰。)
试一试并报告......
答案 1 :(得分:1)
我在这里没有提升,但单(斜)斜线必须在正则表达式中写为\\,因此c ++字符串文字是四个反向。替换字符串必须在c ++中进行转义,因此它的八个反斜杠。
正则表达式中的双引号不得转义,因此它是“”并且在c ++ \“\”中。再次替换必须被转义,所以它的\\“,当然在c ++中,所以它是\\\\\”。
根据您的更新3,模式和替换字符串必须像这样初始化:
const std::string singleslashpat("\\\\");
const std::string doublequotepat("\"\"");
const std::string doubleslash("\\\\\\\\");
const std::string slashquote("\\\\\"");