url正则

来源:互联网 发布:2013知乎年度吐槽精选 编辑:程序博客网 时间:2024/05/21 09:45

用来匹配URL的正则表达式:

var parse_url= /^ (?:([A-Za-z]+):)? (\/{0,3}) ([0-9.\-A-Za-z]+) (?::(\d+))? (?:\/([^?#]*))? (?:\?([^#]*))? (?:#(.*))? $/;

解释:

(?:([A-Za-z]+):)?  当它之后跟随一个:(冒号)的时候才匹配。

(?:   )表示一个非捕获型分组,不捕获匹配结果。后缀?表示这个分组是可选的(表示重复01次)。

    (    )表示一个捕获型分组,后缀+表示这个字符类至少匹配1

(\/{0,3}) \(反斜杠)转义,获得/ 03

([0-9.\-A-Za-z]+) 捕获型分组,匹配一个主机名,捕获1个或多个 数字、字母或.-

(?: :(\d+))?\d表示一个数字

(?:\/([^?#]*))?    /开始,之后的[^?#]中 ^是“非”的意思。 *表示0个或多个。

(?:\?([^#]*))?

(?:#(.*))?

 

关于非捕获:

匹配2015-04-21,你可以用\d{4}-\d{2}-\d{2},你也可以加个括号(\d{4})-(\d{2})-(\d{2}),意思是完全一样的,但加了括号,就意味括号里面的东西,你捕获到了,你可以再使用,这就是捕获组的概念

上面这种情况,你是没必要加括号,但是,有时候你必不得已要加括号,比如说匹配1-100的数字,你会用^([1-9]?[0-9]|100)$,但是这个时候,会默认把括号里的东西捕获过来以供你下次使用,其实,你只是用着正则匹配而已,因此就造成了内存浪费,当正则复杂时,效率更加低下,因此才有了非捕获组,上面的就可以改写成^(?:[1-9]?[0-9]|100)$

0 0