的RFC 2396附錄B給出了一個正則表達式的一個謊言分裂一個URI到它的組件,我們可以使其適用於你的情況
^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*/([^.]+)[^?#]*)(\?([^#]*))?(#(.*))?
#######
這使得The_Token_I_Want
在$6
,這是「hashderlined」上面的子表達式。 (請注意,哈希是不是模式的一部分。)親身體驗:
#! /usr/bin/perl
$_ = "http://domain.com/133742/The_Token_I_Want.zip";
if (m!^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*/([^.]+)[^?#]*)(\?([^#]*))?(#(.*))?!) {
print "$6\n";
}
else {
print "no match\n";
}
輸出:
$ ./prog.pl
The_Token_I_Want
更新:我在您使用boost::regex
評論看,所以請記住在C++程序中轉義反斜槓。
#include <boost/foreach.hpp>
#include <boost/regex.hpp>
#include <iostream>
#include <string>
int main()
{
boost::regex token("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*"
"/([^.]+)"
// ####### I CAN HAZ HASHDERLINE PLZ
"[^?#]*)(\\?([^#]*))?(#(.*))?");
const char * const urls[] = {
"http://domain.com/133742/The_Token_I_Want.zip",
"http://domain.com/12345/another_token.zip",
"http://domain.com/0981723/YET_ANOTHER_TOKEN.zip",
};
BOOST_FOREACH(const char *url, urls) {
std::cout << url << ":\n";
std::string t;
boost::cmatch m;
if (boost::regex_match(url, m, token))
t = m[6];
else
t = "<no match>";
std::cout << " - " << m[6] << '\n';
}
return 0;
}
輸出:
http://domain.com/133742/The_Token_I_Want.zip:
- The_Token_I_Want
http://domain.com/12345/another_token.zip:
- another_token
http://domain.com/0981723/YET_ANOTHER_TOKEN.zip:
- YET_ANOTHER_TOKEN
不要使用正則表達式來解析HTML。你在哪個平臺上?可以有多個子目錄嗎? – 2010-08-15 20:33:27
從字符串結尾返回: /([^\/]+)\..+$/ – 2010-08-15 20:34:12
正則表達式將在JavaScript中運行? – Topera 2010-08-15 20:34:50