0

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

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

4

3 回答 3

1

根据rfc,一个 URL 可以包含-在架构(协议)中,对于非基于 IP 的协议,您可以拥有两个以上/的 '。但是,http它应该始终是://.

(?!\/)负前瞻)断言在/'s 的“the”字符串之后的任何内容都不是/. 然而,这并没有多大用处,大多数正则表达式引擎都是贪婪的,所以它会消耗它所能消耗的所有/东西,所以不应该/留下任何非字符。此外,下一个字符或者不在/可选(?:[^\/]+\.)?部分中,如果不匹配,则下一个字符将wwikimapia.org. 因此,最终前瞻毫无用处。

除非您实际上引用了捕获组,否则将任何组设为非捕获对性能没有任何影响。我会说这仍然是一件好事,如果您实际上使用反向引用,那么养成这个习惯会更容易。

于 2013-04-05T11:45:00.073 回答
0

该模式(?!\/)是一个否定的前瞻断言。换句话说,断言该断言之后的字符不是正斜杠。我不明白为什么要使用它。正如您在问题中所述,几个正斜杠肯定就足够了:

[\w\-]+:\/\/(?:[^\/]+\.)?wikimapia\.org

于 2013-04-05T10:06:16.193 回答
0

我不能对那个表达本身说太多,但这会更好:

var suffix = 'wikimapia.org';
if ((matches = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/)) {
    if (matches[4] && matches[4].substr(-suffix.length) == suffix) {
        // valid
    }
}
于 2013-04-05T10:33:13.083 回答