在C ++中获取最后N个URL段

时间:2012-07-31 23:12:10

标签: c++ algorithm stl

我需要编写一个函数来返回给定URL的最后N个段,即给定 / foo / bar / zoo N=2,我希望能够返回 /酒吧/动物园即可。应适当处理边界条件。我在C语言中没有问题,但我能提出的最佳C ++版本是:

string getLastNSegments(const string& url, int N)
{
    basic_string<char>::size_type found = 0, start = path.length()+1;

    int segments = 2;
    while (start && segments && (start = path.find_last_of('/', start-1)) != string::npos) {
        found = start;
        segments--;
    }

return url.substr(found);
}

cout << "result: " << getLastNSegments("/foo/bar/zoo", 2) << endl;

是否有更惯用的(STL +算法)方法?

3 个答案:

答案 0 :(得分:2)

使用std::stringrfind()

您连续rfind次呼叫最后一个索引作为参数N次。您现在拥有要查找的字符串的起始索引,并使用substr来提取子字符串。

std::string x("http:/example.org/a/b/abc/bcd");
int N = 3;
int idx = x.length();
while ( idx >= 0 && --N > 0 )
{
   idx = x.rfind('/',idx) - 1;
}
std::string final = x.substr(idx);

答案 1 :(得分:0)

使用循环没有错。不知道任何STL字符串函数会在一次调用中执行您想要的操作。

顺便说一句,当您要求http://www.google.com/的最后3段时会发生什么?

叫我老派,但我个人不会在这里使用任何STL搜索...这有什么问题:

if( N <= 0 || url.length() == 0 ) return "";

const char *str = url.c_str();
const char *start = str + url.length();
int remain = N;

while( --start != str )
{
    if( *start == '/' && --remain == 0 ) break;
}

return string(start);

答案 2 :(得分:0)

最后但并非最不重要的是,一个简单的升压拆分解决方案

string getLastNSegments(const string& url, int n)
{
    string selected;
    vector<string> elements;
    boost::algorithm::split(elements, url, boost::is_any_of("/"));

    for (int i = 0; i < min(n, int(elements.size())); i++)
        selected = "/" + elements.at(elements.size()-1-i) + selected;

    return selected;
}