c++ - 允许用户通过在 C++ 中加倍来传递分隔符

标签 c++ string escaping separator

我有一个接受以下格式字符串的 C++ 函数:

<WORD>: [VALUE]; <ANOTHER WORD>: [VALUE]; ...

这是函数:

std::wstring ExtractSubStringFromString(const std::wstring String, const std::wstring SubString) {

    std::wstring S = std::wstring(String), SS = std::wstring(SubString), NS;
    size_t ColonCount = NULL, SeparatorCount = NULL; WCHAR Separator = L';';

    ColonCount = std::count(S.begin(), S.end(), L':');
    SeparatorCount = std::count(S.begin(), S.end(), Separator);

    if ((SS.find(Separator) != std::wstring::npos) || (SeparatorCount > ColonCount))
    {
        // SEPARATOR NEED TO BE ESCAPED, BUT DON'T KNOW TO DO THIS.
    }

    if (S.find(SS) != std::wstring::npos)
    {
        NS = S.substr(S.find(SS) + SS.length() + 1);

        if (NS.find(Separator) != std::wstring::npos) { NS = NS.substr(NULL, NS.find(Separator)); }
        if (NS[NS.length() - 1] == L']') { NS.pop_back(); }

        return NS;
    }
    return L"";
}

如果我像这样使用上面的函数,它会正确输出 MANGO:

ExtractSubStringFromString(L"[VALUE: MANGO; DATA: NOTHING]", L"VALUE")

但是,如果我在后面的字符串中有两个转义分隔符,我尝试像 ;; 这样加倍,但我仍然得到 MANGO 而不是 ;MANGO;:

ExtractSubStringFromString(L"[VALUE: ;;MANGO;;; DATA: NOTHING]", L"VALUE")

这里,赋值符是冒号,分隔符是分号。我想允许用户通过将额外的冒号和分号加倍来​​将冒号和分号传递给我的函数。就像我们在很多脚本语言和编程语言中,在很多程序命令的参数中,对双引号、单引号等进行转义一样。

想了想也想不出办法。谁能帮我解决这种情况?

提前致谢。

最佳答案

您应该在字符串中搜索 ;; 并将其替换为临时填充符 charstring ,稍后可以引用和替换为值。

所以基本上:

1) 搜索字符串并将 ;; 的所有实例替换为 \tempFill
- 最好是选择一个极不可能出现在原始字符串中的字符组合。
2) 解析字符串
3)\tempFill 的所有实例替换为 ;

注意: 明智的做法是对您的字符串运行断言,以确保您的 \tempFill(或您选择作为填充符的任何内容)不在原始字符串中字符串以防止错误/故障/错误。您可以使用诸如 \n 之类的字符,并确保原始字符串中没有。

免责声明: 我几乎可以保证有更清洁和更有效的方法来做到这一点,但这是最简单的方法。

关于c++ - 允许用户通过在 C++ 中加倍来传递分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45487501/

相关文章:

c++ - 一次又一次尝试在给出错误路径的同时打开文件

Java - 写入文件时按字面意思转义反斜杠

sql - 为什么这个正确转义的 SQL 查询会失败?

c++ - Qt 中的文件选择

c++ - 通过更改代码格式计算结构 vector 中包含的双变量的平均值的不同结果?

Java:Cast on Iterator忽略除String类型以外的整数

比较 C 中的两个 uchar

java - 使用java代码从文本文件中读取单个反斜杠

c++ - C++生成数据的平滑度

c# - 在内存中保存大型可编辑文档的最佳方法