《JavaScript语言精粹》第七章-正则表达式

相反地,选到一个称心如意的配偶,就能百年谐和,幸福无穷。我们不应该选谁来配亨利国王,他作为一国之君,·····
———威廉-莎士比亚

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

正则表达式是一种简单语言的语法规范,对字符串中的信息实现查找、替换和提取操作。
可处理正则表达式的方法有6种:regexp.execregexp.teststring.matchstring.replacestring.searchstring.spilt
JS中正则表达式相较于等效的字符串处理有着显著的性能优势。

一个例子

一个用来匹配URL的正则表达式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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','post','path','query','hash'];

var blanks=' ';
var i;

for(i=0;i<names.length;i++){
document.writeln(names[i]+':'+blanks.substring(names[i].length)+result[i]);
}

我们分解parse_url的各个部分,看他们如何工作:

^

^字符表示此字符串的开始。它是一个锚,指引exec跳过那些不像URL的前缀,只匹配开头像URL一样的字符串。

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

这个因子匹配一个协议名,但仅当它后面跟随一个:的时候才匹配。
(?:...)表示一个非捕获型分组;(...)表示一个捕获型分组,它会复制它所匹配的文本,并放到result数组中。每个捕获型分组都会被指定一个编号。第一个捕获型分组的编号是1。
[…]表示一个字符类。

(\/{0,3})

这个因子是捕获型分组2。/表示匹配斜杠。

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

这个因子是捕获型分组3。它会匹配一个主机名,由一个或多个数字、字母,以及.或-字符组成。

(?::(\d+))?

这个因子匹配端口号,它是由一个前置:加上一个或多个数字而组成的序列。一个或多个数字组成的数字串会被捕获型分组4捕获。

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

这是一个可选的分组。[^?#]表示这个类包含除?和#之外的所有字符,被捕获型分组5捕获。

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

这是一个可选的分组。它包含捕获型分组6,这个分组包含0个或多个非#字符。

(?:#(.*))?

.会匹配除行结束符以外的所有字符。

(?:#(.*))?

$表示这个字符串的结束。

结构

RegExp能设置3个标识。如下

标识 含义
g 全局的。匹配多次;不同方法对g标识的处理各不相同
i 忽略字符大小写
m 多行。^和$能匹配行结束符

RegExp对象包含的属性

属性 用法
global 如果标识g被使用,值为true
ignoreCase 如果标识i被使用,值为true
lastIndex 下一次exec匹配开始的索引。初始值为0.
multiline 如果标识m被使用,值为true
source 正则表达式源码文本

元素

构成正则表达式有以下元素:

  1. 正则表达式分支
    一个正则表达式分支包含一个或多个正则表达式序列。这些序列被|字符分隔。从左到右顺序匹配。

  2. 正则表达式序列
    一个正则表达式序列包含一个或多个正则表达式因子。每个因子能选择是否跟一个量词。

  3. 正则表达式因子
    一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。
    以下控制字符和特殊字符当作字符字面量时需要前缀\转义:
    \ / [ ] ( ) { } ? + * | . ^ $

  4. 正则表达式转义
    \字符在正则表达式因子中与其在字符串中一样均表示转义,但稍有不同。
    \f是换页符,\n是换行符,\r是回车符,\是制表符
    \d等同于[0-9],匹配一个数字。\D则与其相反:[^0-9]
    \s等同于[\f\n\r\t\u000B\u0020\u00A0\U2028\2029],匹配任意空白符。\S则与其相反。
    \w等同于[0-9A-Z_a-z],匹配任意字母或数字或下划线或汉字。\W则与其相反。
    \b匹配单词的开始或结束。
    \1指向分组1所捕获到的文本的一个引用。\2 \3依次类推。

  1. 正则表达式分组
  • 分4种分组
    1. 捕获型,一个被包围在圆括号中的正则表达式分支。
    2. 非捕获型,有一个?:前缀,不会捕获所匹配的文本,不会干扰捕获型分组的编号。
    3. 向前正向匹配,不是一个好特性
    4. 向前负向匹配,不是一个好特性
  1. 正则表达式字符集
    正则表达式字符集是一种指定一组字符的便利方式,可以理解为类。
    类提供两个便利:1.能够指定字符范围;2.类的求反

  2. 正则表达式字符转义
    字符类内部的转义和正则表达式因子相比稍有不同,[\b]是退格符。下面是在字符类中需要转义的特殊字符:
    - / \ [ ] ^

  3. 正则表达式量词
    正则表达式因子可以用一个正则表达式量词后缀来决定这个因子应该被匹配的次数。
    ?等同于{0,1},*等同于{0,}+等同于{1,}
    只有一个量词,表示趋向于进行贪婪性匹配,即匹配尽可能多的副本直至达到上限。
    这个量词附近一个后缀?,则表示趋向于进行非贪婪匹配,即只匹配必要的副本就好。

liborn wechat
欢迎您扫一扫上面的微信二维码,订阅我的公众号!