如何从 cpp 中的给定字符串中提取特定字符串

How to extract specific string from given string in cpp?

本文关键字:字符串 提取 cpp      更新时间:2023-10-16

我有以下字符串称为header:"bla bla hello, just more characters filename="myfile.1.2.doc" more characters"

我需要从这个字符串中获取文件名和文件类型,但我的解决方案似乎非常混乱(伪代码):

unsigned int end = header.find("filename=");
unsigned int end2 = header.find(" " ", end + sizeof("filename=") + 1) // how to search for ' " ' ?!
std::string fullFileName = header.substr(end +sizeof("filename=") + 1 ,end2 -1);
//now look for the first "." from the end and split by that .

CPP的结尾如何看待?


我认为如果使用正则表达式会更好。
例如:我们有更复杂的字符串,其中包含一些文件名和文件名外的令人困惑的字符,例如 (")。

std::string str("bla bla hello, just more characters filename="myfile.1.2.doc" more characters bla bla hello, just more characters filename="newFile.exe" more char"acters");
std::smatch match;
std::regex regExp("filename="(.*?)\.([^.]*?)"");
while (std::regex_search(str, match, regExp))
{
    std::string name = match[1].str();
    std::string ext = match[2].str();
    str = match.suffix().str();
}

第一次迭代为您提供:
名称 = 我的文件.1.2
分机 = 文档
第二种:
名称 = 新文件
分机 = EXE

size_t startpos = header.find("filename=");
if (startpos != header.npos)
{ // found filename
    startpos += sizeof("filename=") - 1; // sizeof determined at compile time. 
                                         // -1 ignores the null termination on the c-string
    if (startpos != header.length() && header[startpos] == '"')
    { // next char, if there is one, should be "
        startpos++;
        size_t endpos = header.find('"', startpos);
        if (endpos != header.npos)
        { // found terminating ". get full file name
            std::string fullfname = header.substr(startpos, endpos-startpos);
            size_t dotpos = fullfname.find_last_of('.');
            if (dotpos != fullfname.npos)
            { // found dot split string
                std::string filename = fullfname.substr(0, dotpos); 
                //add extra brains here to remove path
                std::string filetype = fullfname.substr(dotpos + 1, token.npos);
                // dostuff
                std::cout << fullfname << ": " << filename << " dot " << filetype << std::endl;
            }
            else
            {
                // handle error
            }
        }
        else
        {
            // handle error
        }
    }
    else
    {
        // handle error
    }
}
else
{
    // handle error
}