允许用户通过在 C++ 中加倍来传递分隔符
Allow user to pass a separator character by doubling it in C++
我有一个接受以下格式字符串的 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")
这里,赋值符是冒号,分隔符是分号。我想允许用户通过将额外的冒号和分号加倍来将冒号和分号传递给我的函数。就像我们在很多脚本语言和编程语言中转义双引号、单引号等等,还有很多程序命令的参数中。
想了想也想不出办法。谁能帮我解决这种情况?
提前致谢。
您应该在字符串中搜索 ;;
并将其替换为临时填充符 char
或 string
,稍后可以引用并替换为该值。
所以基本上:
1) 搜索字符串并将 ;;
的所有实例替换为 \tempFill
- 最好选择一个极不可能出现在原始字符串中的字符组合。
2) 解析字符串
3) 将 \tempFill
的所有实例替换为 ;
注意: 明智的做法是 运行 在您的字符串上断言以确保您的 \tempFill
(或您选择的任何填充物)不在原始字符串中以防止 bug/fault/error。您可以使用 \n
之类的字符,并确保原始字符串中没有
免责声明:
我几乎可以保证有更清洁和更有效的方法来做到这一点,但这是最简单的方法。
首先,由于不需要拆分子字符串,因此我假设不需要对其进行预处理以过滤转义分隔符。
然后在主字符串上,恕我直言,最简单的方法是在字符串中搜索转义分隔符时过滤它们。伪代码(假设封闭的 []
已被删除):
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++
我有一个接受以下格式字符串的 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")
这里,赋值符是冒号,分隔符是分号。我想允许用户通过将额外的冒号和分号加倍来将冒号和分号传递给我的函数。就像我们在很多脚本语言和编程语言中转义双引号、单引号等等,还有很多程序命令的参数中。
想了想也想不出办法。谁能帮我解决这种情况?
提前致谢。
您应该在字符串中搜索 ;;
并将其替换为临时填充符 char
或 string
,稍后可以引用并替换为该值。
所以基本上:
1) 搜索字符串并将 ;;
的所有实例替换为 \tempFill
- 最好选择一个极不可能出现在原始字符串中的字符组合。
2) 解析字符串
3) 将 \tempFill
的所有实例替换为 ;
注意: 明智的做法是 运行 在您的字符串上断言以确保您的 \tempFill
(或您选择的任何填充物)不在原始字符串中以防止 bug/fault/error。您可以使用 \n
之类的字符,并确保原始字符串中没有
免责声明: 我几乎可以保证有更清洁和更有效的方法来做到这一点,但这是最简单的方法。
首先,由于不需要拆分子字符串,因此我假设不需要对其进行预处理以过滤转义分隔符。
然后在主字符串上,恕我直言,最简单的方法是在字符串中搜索转义分隔符时过滤它们。伪代码(假设封闭的 []
已被删除):
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++