首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与URL解析regexp混淆

与URL解析regexp混淆
EN

Stack Overflow用户
提问于 2013-04-05 17:49:07
回答 3查看 91关注 0票数 0

我在代理PAC file中遇到一个解析正则表达式的url。

它的功能是匹配属于wikimapia域的任何url模式(顺便说一句,只是我的猜测)。

代码语言:javascript
复制
^[\w\-]+:\/+(?!\/)(?:[^\/]+\.)?wikimapia\.org

我将其拆分,并给出我的困惑如下:

代码语言:javascript
复制
^ 
[\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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-05 19:45:00

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

(?!\/) (负向前视)断言/字符串后面的任何字符都不是/。然而,这并没有多大用处,大多数正则表达式引擎都是贪婪的,所以它会消耗所有的/,所以不应该留下任何非/字符。此外,可选的(?:[^\/]+\.)?部分中的下一个字符不是/,如果不匹配,那么wikimapia.org中的下一个字符将是w。因此,最终前视没有任何作用。

除非您实际上引用了捕获组,否则使任何组不捕获只会对性能产生任何影响。我想说这仍然是一件好事,如果你真的在使用反向引用,拥有这个习惯会让它变得更容易。

票数 1
EN

Stack Overflow用户

发布于 2013-04-05 18:06:16

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-04-05 18:33:13

关于这个表达式本身,我不能说太多,但这样会更好:

代码语言:javascript
复制
var suffix = 'wikimapia.org';
if ((matches = url.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/)) {
    if (matches[4] && matches[4].substr(-suffix.length) == suffix) {
        // valid
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15830781

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档