以分割URL为例,记录一点正则表达式的用法~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var parse_url = /^(?:([A-Za-z]+):)?(\/{0,3})([0-9.\-A-Za-z]+)(?::(\d+))?(?:\/([^?#]*))?(?:\?([^#]*))?(?:#(.*))?$/;
var url = "http://www.ora.com:80/goodparts?q#fragment";
var result = parse_url.exec(url);
var names = ['url','scheme','slash','host','port','path','query','hash'];
var blanks = ' ';
for (var i = names.length - 1; i >= 0; i--) {
console.log(names[i] + ':' + blanks.substring(names[i].length), result[i])
}
这段代码产生如下结果:
hash: fragment
query: q
path: goodparts
port: 80
host: www.ora.com
slash: //
scheme: http
url: http://www.ora.com/goodparts?q#fragment

^字符表示字符串的开始:

1
(?:([A-Za-z]+):)?

匹配协议名,A-Za-z这个字符类包含26个大小写字母。连字符(-)表示范围A到Z。后缀 + 表示这个字符类会被匹配一次或者多次。

1
(\/{0,3})

匹配//,\/表示应该匹配/(斜杠)。它用\(反斜杠)来进行转义,以免被错误解释为结束符。后缀{0,3}表示/会被匹配0次,或者1~3次。

1
([0-9.\-A-Za-z]+)

匹配主机名,由一个或多个数字,字母以及 . 或 - 字符组成。 - 会被转义为 - 以防与表示范围的连字符混淆。

1
(?::(\d+))?

匹配端口号,它由一个前置 : 加上一个或多个数字而组成的序列。 \d 表示一个数字字符。

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

以 / 开始。之后的字符类[^?#]以一个^开始,它表示这个类包含除 ? 和 # 之外的所有字符。 * 表示这个字符类会被匹配0次或多次。

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

以 ? 开始匹配url带参。包含0个或多个非 # 字符。

1
(?:#(.*))?

以 # 开始匹配除行结束符以外的所有字符。

1
$

$ 表示这个字符串的结束。它保证在这个url的尾部没有其他更多的内容了。