混淆URL解析regexp

时间:2013-04-05 09:49:07

标签: javascript regex

我遇到了一个在代理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

希望有人能解释我的困惑。

3 个答案:

答案 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
    }
}