【问题标题】:Using boost::regex to replace a backslash with double backslash and double quote with a slash quote使用 boost::regex 用双反斜杠替换反斜杠,用斜杠引号替换双引号
【发布时间】:2012-07-12 22:06:37
【问题描述】:

我要努力让它发挥作用。到目前为止,这是我所拥有的,但 ça ne marche 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);

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

更新 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);

【问题讨论】:

  • 它到底是如何进行的?编译时错误?运行时完全匹配失败?运行时替换错误?碰撞?意外发射核弹头?
  • 核弹头。 ;) 不只是在开玩笑——在运行时完全匹配失败。所有的单斜杠都还在。
  • 我真的需要多少个反斜杠来告诉它寻找一个反斜杠!嘘。
  • 其实也许它真的起作用了,只是当我看到它时,双斜线变成了一个斜线? (更新,不)
  • 啊哈。我想你想要match_default 而不是match_all;后者似乎有一些相当令人惊讶的意思,这根本不是你想要的。

标签: regex boost backslash


【解决方案1】:

所以,我不是 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 in你修改过的测试用例,看看它是否有效。或者,也许我错过了一些东西,它必须匹配整个输入,你可以通过替换Watermelon而不是Wn来检查。或者你不能打扰,如果您碰巧对此不感兴趣。)

试一试,然后报告……

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 还没有,如果我换掉双斜杠和斜杠引号,那么替换似乎根本没有做任何事情。
    • @tofutim 是的,反斜杠也必须在替换字符串中转义,我会更正我的答案
    • @GarethMcCaughan 这取决于,如果 tofutim 想替换 "" 或 "... ;-)
    • 哦,是的,确实如此。很遗憾,“双引号”这个词如此含糊。
    • 好的,这个正则表达式是正确的,但结果证明我使用 boost::regex 的方式有一个错误......出于某种原因,我不能把它像这样在 regex_replace 里面。有关工作解决方案,请参阅 update3。您可以更新您的答案,我会检查它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-16
    • 1970-01-01
    • 2019-11-29
    • 2018-02-13
    • 1970-01-01
    • 2022-01-27
    • 2013-06-24
    相关资源
    最近更新 更多