提取 C++ 中分量之间的子字符串

Extract a substring between delimeters in C++

本文关键字:字符串 之间 分量 C++ 提取      更新时间:2023-10-16

我必须得到两个引号之间的子字符串"Debian GNU/Linux 8 (jessie)",例如:

PRETTY_NAME="Debian GNU/Linux 8 (jessie)"

但我不知道该怎么做,我无法做到这一点。

我实际拥有的最好的代码:

std::ifstream osVersion("/usr/lib/os-release");
std::string os_str;
if (osVersion.is_open())
getline(osVersion, os_str);
osVersion.close();
this->os = os_str.substr(os_str.find("""), os_str.find("""));

它给出了这样的输出:

"Debian GNU/

问题是当你这样做时

this->os = os_str.substr(os_str.find("""), os_str.find("""));

find在每个调用中找到相同的"。 这意味着您将在第一个"开始子字符串,然后它将是N个字符长,其中N是第一个"的位置。

您可以通过捕获第一个"的倾斜并使用它来获得下一个像

std::size_t pos = os_str.find(""");
this->os = os_str.substr(pos + 1, os_str.find(""", pos + 1) - pos - 1);

请注意,为了使代码防弹,您应该捕获两个位置并确保不等于std::string::npos如果其中任何一个,您都有格式不正确的刺痛,并且上述方法将崩溃。

std::find在这里更容易使用:

std::string::iterator begin = std::find(std::begin(os_str), std::end(os_str), '"');
if (begin != std::end(os_str)) {
++begin;
std::string::iterator end = std::find(begin, std::end(os_str), '"');
this->os = std::string(begin, end);
}