在分隔符之间获取字符串

Getting string in between delimiters

本文关键字:字符串 获取 之间 分隔符      更新时间:2023-10-16

大家好,

我在分解字符串("剪切"和使用分隔符之间的部分字符串)时遇到问题。

到目前为止,这就是我设法做到的:

    std::string begin_processed_received_DATA = "&7?@670*/5#^";
    std::string end_processed_received_DATA = "*8d4a#%";
    processed_received_DATA = receive_DATA;
    //Checks if delimiter exists in message (by setting NO_DELIMITER to represent number where END DELMITER is in string array)
    std::size_t NO_DELIMITER = processed_received_DATA.find(end_processed_received_DATA);
    if (NO_DELIMITER != std::string::npos) {
        //Deletes string from end
        processed_received_DATA.resize(processed_received_DATA.find(end_processed_received_DATA));
        //Deletes string from begining (starting at string[0])
        processed_received_DATA.erase(0, processed_received_DATA.find(begin_processed_received_DATA) + begin_processed_received_DATA.size());
    }
    else {
        return 201502;
    }

有没有人知道我应该如何处理这个问题?

示例receive_DATA是这样的:984GE#$% 534'694 4685)_(9357uf0 di,stre89/4&7?@670*/5#^nulter.dd/se 895/68.476*8d4a#%897 R#3t746+- @1

我必须通知我的receive_DATA字符串由许多符号、数字、空格、字母组成,长度约为 20000 个符号。这是图片,以了解它是哪种字符串。(我记得以类似的方式用更短的字符串解决了这个问题)

std::string find_delimited(const std::string& data,
        const std::string& begin_delimiter,
        const std::string& end_delimiter) {
    std::size_t begin = data.find(begin_delimiter);
    if (begin == std::string::npos)
        // error: begin_delimiter not found
    begin += begin_delimiter.size();
    std::size_t end = data.find(end_delimiter, start;
    if (end == std::string::npos) 
        // error: end_delimiter not found
    return data.substr(begin, end - begin);
}

您可以使用标准string类的find()方法。正如您可以在此处阅读的更多信息,此方法返回字符串中子字符串的第一个索引。

我假设receive_DATA是一个std::string,因为它没有在您的代码示例中显式声明。

您要做的是从查找分隔符的位置开始,如下所示:

size_t dataBegin = receive_DATA.find(begin_proccessed_received_DATA) + 
                                    begin_proccessed_received_DATA.length();
string dataAfterFirstDelim;
size_t dataEnd;
if (dataBegin != string::npos)
{
    dataAfterFirstDelim = receive_DATA.substr(dataBegin, 
                                                     receive_DATA.length() - dataBegin);
    dataEnd = dataAfterFirstDelim.find(end_proccessed_received_DATA);
}

请注意,您必须将第一个分隔符的长度添加到该分隔符的起始位置,才能找到数据的开头。从那里,您只需要在数据开头(如@SergeBallesta所指出)之后搜索第二个分隔符。

当您知道它们在字符串中出现的位置时,您可以使用 substr 方法轻松找到它们之间的子字符串,该方法采用起始位置和长度。由于您现在有一个从数据开始的字符串,因此您可以从数据的开始到数据的结束点执行子字符串。

if (dataBegin != string::npos && dataEnd != string::npos)
{
    processed_received_DATA = dataAfterFirstDelim.substr(0, dataEnd);
}