javascript语言精粹-正则表达式

正则表达式

javascript的许多特性都借鉴自其它语言。语法借鉴自Java,函数借鉴自Scheme,原型继承借鉴自Self。而javascript的正则表达式特性借鉴自Perl。


/*
(?:...)表示一个【非捕获分组】 后缀 ? 表示它重复0 或者1次;
(...)表示一个【捕获分组】,它会复制它匹配到的文本,并把其放到result数组中;
[...]表示一个【字符类】 后缀 + 表示它会被匹配 
后面跟着的 : 会按照字面匹配
*/
(?:([A-Za-z]+):)?

/*
\/表示匹配 '/' {0,3}表示会匹配1~3次
*/
(\/{0,3})

/*
捕获型分组3,匹配一个主机名
*/
([0-9.\-A-Za-z]+)

/*
可选因子匹配端口号
一个或多个数组的字符串会被捕获型分组4捕获
*/
(?::(\d+))?

/*
以一个 / 开始
^ 表示这个类包含 ?和#之外的所有字符
*/
(?:\/([^?#]*))?

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

/*
最后一个分组以#开始,'.'会匹配除行结束符以外的所有字符
*/
(?:#(.*))?

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

var url = 'http://www.nimei.com:8080/wtf?q#fragment';

var result = parse_url.exec(url);
  • 正则表达式分支

【正则表达式分支】包含一个或多个【正则表达式序列】。这些序列被 | 字符分隔。如果这些序列中任何一项符合匹配条件,那么这个选择就匹配。

//会匹配in,但是它不会inf,因为in已经匹配了
'info'.match(/in|inf/);
  • 正则表达式序列

一个【正则表达式序列】包含一个或多个【正则表达式因子】。每个因子选择是否跟随一个量词,这个量词决定着这个因子出现的次数。如果没有这个量词,那么该因子只会匹配一次。

  • 正则表达式因子

一个【正则表达式因子】可以是一个字符,一个由括号包围的组,一个字符类,或者一个转义序列。

可以给任何特殊字符添加一个 \ 前缀来使其字面化

  • 正则表达式分组
  1. 捕获型 (...)
  2. 非捕获型 (?:...) 不会影响分组的编号
  3. 向前正向匹配(?=....)
  4. 向前负向匹配
  • 正则表达式量词

【正则表达式因子】可以用一个【正则表达式量词】后缀来决定这个因子应该被匹配的次数。

/www/ 和 /w{3}/一样

{3,6}会匹配3、4、5或6次

{3,}会匹配3次或更多

? 等同于 {0,1} ,*等同于 {0,},+等同于{1,}

如果只有一个量词,表示趋向于贪婪性匹配,即匹配尽可能多的副本直至达到上线。如果这个量词增加一个后缀 ?,则表示趋于非贪婪匹配,即只要匹配比较的副本就好。