求一个URL匹配的正则表达式

要在匹配*.cn*这个wildcard表达式的结果中去除调符合*google.cn*,正则应该怎么写?

就是说,我想要在匹配.cn的URL但不想要匹配google.cn的URL,应该怎么做?

阅读 22.8k
4 个回答

你需要的是“预匹配”,详情可参见

http://blog.csdn.net/keystudio/articl...

例:Perl5的<<(?<!a)b>>将会匹配一个没有“a”作前导字符的“b”。

注:由于不同语言的不同正则实现支持不同,该效果不一定能实现,具体的语法也会有差异。

一个URL由协议+用户名+密码+域名+端口+路径+哈希构成,知道哪些是必须的,哪些是可选的,写起来就方便许多了。
这里就参考小鱼 @sofish 的代码片断吧。LZ自己选着用吧。

// 支持类型:
    // http(s)://(username:password@)(www.)domain.(com/co.uk)(/...)
    // (s)ftp://(username:password@)domain.com/...
    // git://(username:password@)domain.com/...
    // irc(6/s)://host:port/... // 需要测试
    // afp over TCP/IP: afp://[<user>@]<host>[:<port>][/[<path>]]
    // telnet://<user>:<password>@<host>[:<port>/]
    // smb://[<user>@]<host>[:<port>][/[<path>]][?<param1>=<value1>[;<param2>=<value2>]]
    url: function(text){
      var protocols = '((https?|s?ftp|irc[6s]?|git|afp|telnet|smb):\\/\\/)?'
        , userInfo = '([a-z0-9]\\w*(\\:[\\S]+)?\\@)?'
        , domain = '([a-z0-9]([\\w]*[a-z0-9])*\\.)?[a-z0-9]\\w*\\.[a-z]{2,}(\\.[a-z]{2,})?'
        , port = '(:\\d{1,5})?'
        , ip = '\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}'
        , address = '(\\/\\S*)?'
        , domainType = [protocols, userInfo, domain, port, address]
        , ipType = [protocols, userInfo, ip, port, address]
        , validate

      validate = function(type){
        return new RegExp('^' + type.join('') + '$', 'i').test(text);
      };

      return validate(domainType) || validate(ipType);

我来回答一下自己N年前的问题。。。

Python支持negative lookbehind assertion

In [9]: re.search(r'.*(?<!google)\.cn.*', "www.baidu.cn").group(0)
Out[9]: 'www.baidu.cn'

In [14]: re.search(r'.*(?<!google)\.cn.*', "www.google.cn")
Out[14]: None

这个事情貌似很难用一个正则解决,可以通过特定语言的and 或者 or进行组合来实现

匹配普遍意义的url

^(https?://)?([\da-z\.-]+)\.([a-z\.]{2,6})([/\w \.-]*)*/?$

匹配cn的url

^(https?://)?([\da-z\.-]+)\.cn([/\w \.-]*)*/?$

匹配google.cn的url

^(https?://)?google\.cn([/\w \.-]*)*/?$
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进