我需要编写一个函数来返回给定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 +算法)方法?
答案 0 :(得分:2)
您连续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;
}