C++获取两个分隔符String之间的字符串

Har*_*ris 10 c c++

是否有任何内置函数可用两个在C/C++中的两个分隔符字符串之间获取字符串?

我的输入看起来像

_STARTDELIMITER_0_192.168.1.18_STOPDELIMITER_
Run Code Online (Sandbox Code Playgroud)

我的输出应该是

_0_192.168.1.18_
Run Code Online (Sandbox Code Playgroud)

提前致谢...

Sak*_*ham 28

你可以这样做:

string str = "STARTDELIMITER_0_192.168.1.18_STOPDELIMITER";
unsigned first = str.find(STARTDELIMITER);
unsigned last = str.find(STOPDELIMITER);
string strNew = str.substr (first,last-first);
Run Code Online (Sandbox Code Playgroud)

考虑到您的STOPDELIMITER分隔符最后只会出现一次.

编辑:

由于分隔符可以多次出现,因此将查找STOPDELIMITER的语句更改为:

unsigned last = str.find_last_of(STOPDELIMITER);
Run Code Online (Sandbox Code Playgroud)

这将使您在第一个STARTDELIMITER和最后一个STOPDELIMITER之间进行文本处理,尽管它们被重复多次.

  • 但这是一个char delimiter(s).它不是字串btw两个字符串. (4认同)
  • H感谢您的回答,但我得到的结果像STARTDELIMITER_0_192.168.1.18_ (2认同)

ifm*_*fma 9

我不知道上面怎么回答收到的,它没有这么多的选票时,这个问题显然问如何获得线二分隔符之间的字符串,而不是对字符.

如果您愿意这样做,您需要考虑字符串分隔符的长度,因为它不仅仅是一个字符.

案例1:两个分隔符都是唯一的:

给定一个要从_STARTDELIMITER_0_192.168.1.18_STOPDELIMITER_中提取的字符串_0_192.168.1.18_,您可以像这样修改最佳答案以获得所需的效果.这是最简单的解决方案,不会引入额外的依赖关系(例如Boost):

#include <iostream>
#include <string>

std::string get_str_between_two_str(const std::string &s,
        const std::string &start_delim,
        const std::string &stop_delim)
{
    unsigned first_delim_pos = s.find(start_delim);
    unsigned end_pos_of_first_delim = first_delim_pos + start_delim.length();
    unsigned last_delim_pos = s.find(stop_delim);

    return s.substr(end_pos_of_first_delim,
            last_delim_pos - end_pos_of_first_delim);
}

int main() {
    // Want to extract _0_192.168.1.18_
    std::string s = "_STARTDELIMITER_0_192.168.1.18_STOPDELIMITER_";
    std::string s2 = "ABC123_STARTDELIMITER_0_192.168.1.18_STOPDELIMITER_XYZ345";

    std::string start_delim = "_STARTDELIMITER";
    std::string stop_delim = "STOPDELIMITER_";

    std::cout << get_str_between_two_str(s, start_delim, stop_delim) << std::endl;
    std::cout << get_str_between_two_str(s2, start_delim, stop_delim) << std::endl;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

会打印_0_192.168.1.18_两次.

有必要添加第一个分隔符的位置在第二个参数std::string::substr作为last - (first + start_delim.length()),以确保它仍然会正确地提取所需的内部串中的起始分隔符不位于字符串的最开始的情况下,这表现在上面的第二个案例中.

演示.

案例2:唯一的第一个分隔符,非唯一的第二个分隔符:

假设您希望在唯一分隔符和第一个分隔符后遇到的第一个非唯一分隔符之间获取字符串.您可以修改上面的函数get_str_between_two_strfind_first_of代替获得所需的效果:

std::string get_str_between_two_str(const std::string &s,
        const std::string &start_delim,
        const std::string &stop_delim)
{
    unsigned first_delim_pos = s.find(start_delim);
    unsigned end_pos_of_first_delim = first_delim_pos + start_delim.length();
    unsigned last_delim_pos = s.find_first_of(stop_delim, end_pos_of_first_delim);

    return s.substr(end_pos_of_first_delim,
            last_delim_pos - end_pos_of_first_delim);
}
Run Code Online (Sandbox Code Playgroud)

相反,如果要捕获第一个唯一分隔符和最后一个遇到的第二个分隔符之间的任何字符,就像上面提到的请求者所做的那样,请find_last_of改用.

案例3:非唯一的第一个分隔符,唯一的第二个分隔符:

与情况2非常相似,只需反转第一个分隔符和第二个分隔符之间的逻辑.

案例4:两个分隔符都不是唯一的:

同样,与情况2非常相似,使容器捕获两个分隔符中的任何一个之间的所有字符串.循环遍历字符串并更新第一个分隔符的位置,使其等于遇到第二个分隔符的位置,并将其间的字符串添加到容器中.重复直到std::string:npos达到.