我遇到了一个在代理PAC file中解析正则表达式的url。
它的功能是匹配属于域wikimapia的任何url模式。(顺便说一句,只是我的猜测)
^[\w\-]+:\/+(?!\/)(?:[^\/]+\.)?wikimapia\.org
我把它分开并给出了如下的困惑:
^
[\w\-]+ // any protocol name containing '-' ?
:
\/+ // why not use '\/\/', aren't protocol names follow by '://' ?
(?!\/) // what's the function of this part?
(?:[^\/]+\.)? // is non-capturing grouping ?: necessary here? or just for optimization?
wikimapia
\.
org
希望有人能解释我的困惑。
答案 0 :(得分:1)
根据rfc,网址可以在架构(协议)中包含-
,对于非基于IP的协议,您可以拥有两个以上的/
。但对于http
,它应始终为://
。
(?!\/)
(负向前瞻)断言,无论是什么,""" /
&#39}的字符串不是/
。然而,这并没有太多用途,大多数正则表达式引擎都是贪婪的,所以它会消耗掉所有/
,所以不应该留下任何非/
个字符。此外,下一个字符在可选的/
部分中不是(?:[^\/]+\.)?
,如果不匹配,则w
中的下一个字符将为wikimapia.org
。因此,最终的前瞻没有任何意义。
除非您实际引用捕获组,否则使任何组不捕获对性能以外的任何事物都没有影响。我会说这仍然是一件好事,如果你实际上使用反向引用那么习惯会让它更容易。
答案 1 :(得分:0)
模式(?!\/)
是一个负前瞻断言。换句话说,声明跟随此断言的字符不是正斜杠。我无法理解它为什么被使用。正如你在问题中所述,一些正斜线肯定就足够了:
[\w\-]+:\/\/(?:[^\/]+\.)?wikimapia\.org
答案 2 :(得分:0)
我不能多说这个表达本身,但这会更好:
var suffix = 'wikimapia.org';
if ((matches = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/)) {
if (matches[4] && matches[4].substr(-suffix.length) == suffix) {
// valid
}
}