我在代理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
希望有人能解释一下我的困惑。
发布于 2013-04-05 11:45:00
根据rfc,一个URL可以在模式(协议)中包含-
,对于非基于IP的协议,您可以有两个以上的/
,但是对于http
,它应该始终是://
。
(?!\/)
(负向前视)断言/
字符串后面的任何字符都不是/
。然而,这并没有多大用处,大多数正则表达式引擎都是贪婪的,所以它会消耗所有的/
,所以不应该留下任何非/
字符。此外,可选的(?:[^\/]+\.)?
部分中的下一个字符不是/
,如果不匹配,那么wikimapia.org
中的下一个字符将是w
。因此,最终前视没有任何作用。
除非您实际上引用了捕获组,否则使任何组不捕获只会对性能产生任何影响。我想说这仍然是一件好事,如果你真的在使用反向引用,拥有这个习惯会让它变得更容易。
发布于 2013-04-05 10:06:16
模式(?!\/)
是一个否定的先行断言。换句话说,断言此断言后面的字符不是正斜杠。我不明白为什么要用它。正如您在问题中所述,几个正斜杠肯定就足够了:
[\w\-]+:\/\/(?:[^\/]+\.)?wikimapia\.org
发布于 2013-04-05 10:33:13
关于这个表达式本身,我不能说太多,但这样会更好:
var suffix = 'wikimapia.org';
if ((matches = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/)) {
if (matches[4] && matches[4].substr(-suffix.length) == suffix) {
// valid
}
}
https://stackoverflow.com/questions/15830781
复制