1

我需要编写一个函数来返回给定 URL 的最后 N 段,即给定/foo/bar/zooN=2,我希望返回/bar/zoo。边界条件应妥善处理。我用 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+算法)方式来做到这一点?

4

3 回答 3

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);
于 2012-07-31T23:23:24.613 回答
0

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

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

叫我老派,但我个人不会在这里使用任何 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);
于 2012-07-31T23:37:10.140 回答
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;
}
于 2012-08-01T01:35:07.807 回答