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

时间:2017-08-03 14:42:49

标签: 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")

这里,值赋值器是冒号,分隔符是分号。我希望允许用户通过加倍额外的冒号和分号来传递我的函数。就像我们在许多脚本语言和编程语言中使用双引号,单引号和许多其他语法一样,也可以在许多程序命令的参数中使用。

我很努力,但甚至无法想办法。有谁能帮助我解决这个问题?

提前致谢。

2 个答案:

答案 0 :(得分:3)

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

基本上是这样的:

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

注意:在你的字符串上运行一个断言是明智的,以确保你的\tempFill(或你选择的任何填充物)不在原始字符串中以防止错误/故障/错误。您可以使用\n之类的字符,并确保原始字符串中没有。

<强>声明: 我几乎可以保证有更干净,更有效的方法来做到这一点,但这是最简单的方法。

答案 1 :(得分:2)

首先,由于子字符串不需要拆分,我认为不需要对其进行预处理以过滤转义分隔符。

然后在主字符串上,最简单的方法是在字符串中搜索转义分隔符时过滤转义的分隔符。伪代码(假设已删除封闭的[]):

last_index = begin_of_string
index_of_current_substring = begin_of_string
loop: search a separator starting at last index - if not found exit loop
    ok: found one at ix
    if char at ix+1 is a separator (meaning with have an escaped separator
       remove character at ix from string by copying all characters after it one step to the left
       last_index = ix+1
       continue loop
    else this is a true separator
        search a column in [ index_of_current_substring, ix [
        if not found: error incorrect string
        say found at c
        compare key_string with string[index_of_current_substring, c [
        if equal - ok we found the key
            value is string[ c+2 (skip a space after the colum), ix [
            return value - search is finished
        else - it is not our key, just continue searching
            index_of_current_substring = ix+1
            last_index = index_of_current_substring
            continue loop

现在应该很容易将其转换为C ++