日期:2014-05-16  浏览次数:20460 次

JavaScript语言精粹读书笔记- 正则表达式
正则表达式
JavaScript的许多特性都借鉴自其他语言。语法借鉴自Java,函数借鉴自Scheme,原型继承借鉴自Self,正则表达式借鉴自Perl
正则表达式是一门简单语言的语法规范。它以方法的形式被用于对字符串中的信息进行查找、替换和提取操作。可处理正则表达式的方法有regexp.exec、regexp.test、string.match、string.replace、string.search和string.split。通常来说,在JavaScript中正则表达式相较于等效的字符串运算有着显著的性能优势。

一个例子An Example
(?:…)表示一个非捕获型分组(noncapturing group)
(….)标识一个捕获型分组(capturing group)。一个捕获型分组将复制它所匹配的文本,并将其放入result数组中。每个捕获型分组都将被指定一个编号。第一个捕获型分组的编号是1
[…]标识一个字符串类

结构Construction
有两个方法来创建一个RegExp对象:RegExp构造器和正则表达式字面量。优先使用的方法是正则表达式字面量。
正则表达式字面量被包围在一对斜杠中。这有点令人难以捉摸,因为斜杠也被用作除法运算符和注释符。
有3个标志能在RegExp中设置。它们分别由字母g、i和m来标识。这些标志被直接添加在RegExp字面量的末尾。
G:全局的(匹配多次;准确含义随方法而变)
I:大小写不敏感(忽略字符大小写)
M:多行(^和$能匹配行结束符)

RegExp构造器:第一个参数是被编译成正则表达式的字符串(双写反斜杠转义),第二个参数是一个指定标志的字符串。
RegExp构造器适用于正则表达式必须在运行时动态生成的情景
RegExp对象的属性:
global,ignoreCase,multiline,lastIndex:下一次exec匹配开始的索引、初始值为0,source:正则表达式源代码文本

正则表达式字面量创建的RegExp对象是共享一个单实例
function make_a_matcher(){return /a/ig;};
var x = make_a_matcher();
var y = make_a_matcher();
// 注意:x和y是相同的对象!
x.lastIndex = 10;
document.writeln(y.lastIndex);  // 10

元素
正则表达式选择
一个正则表达式选择包括一个或者多个正则表达式序列。这些序列被|(竖线)字符分隔。如果这些序列中的任何一项符合匹配条件,那么这个选择就被匹配。它尝试按顺序依次匹配这些序列。所以:”into”.match(/in|int/)将在into中匹配in。但它不会匹配int,因为in已被匹配成功了。
正则表达式序列
一个正则表达式序列包含一个或者多个正则表达式因子。每个因子能选择是否跟随一个量词,这个量词决定着这个因子被允许出现的次数。如果没有指定这个量词,那么该因子将被匹配一次。

正则表达式因子
一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。除了控制字符和特殊字符外,所有的字符都将被按照字面处理:\/[ ](){}?+*|.^$
如果你希望上面列出的字符按字面去匹配,那么必须要用一个 \ 前缀来进行转义。当你存在疑虑时,可以给任何特殊字符加一个 \ 前缀来使其字面化。\ 前缀不能使字母或数字字面化。
一个未被转义的 . 将匹配除行结束符以外的任何字符。
当lastIndex属性值为0时,一个未转义的 ^ 将匹配该文本的开始。当指定了m标识时,它也能匹配行结束符。一个未转义的 $ 将匹配该文本的结束。当指定了m标志时,它也能匹配行结束符。
正则表达式转义
正则表达式分组
分组共有4组。
捕获型:一个捕获型分组是一个被包围在括号中的正则表达式选择。任何匹配这个分组的字符都将被捕获。每个捕获分组都将被指定了一个数字。在正则表达式中第一个捕获(的分组是1。第二个捕获(的分组是2。
非捕获型:分捕获型分组有一个(?:前缀。非捕获型分组仅做简单的匹配;并不会捕获所匹配的文本。这会有微弱的性能优势。非捕获型分组不会干扰捕获型分组的编号。
向前正向匹配(Positive lookahead):向前正向匹配组有一个(?=前缀。它类似与非捕获型分组,但这个组匹配后,文本将倒回到它开始的地方,实际上并不匹配任何东西。这不是一个好特性。
向前负向匹配(Negative lookahead):向前负向匹配组有一个(?!前缀。它类似于向前正向匹配,但只有当它匹配失败时它才进行匹配。这不是一个好的特性。

正则表达式类Regexp Class正则表达式类是一种指定一组字符的便利方式。例如,如果想匹配一个元音字母,我们可以写作(?:a|e|i|o|u),但它可以被更方便地写成一个类[aeiou]。类提供了两个方便特性:指定字符范围和类的求反。

正则表达式类转义
正则表达式量词Regexp Quantifier
?:{0,1};*:{0,};+:{1,}
如果只有一个量词,则趋向于进行贪婪性匹配,即匹配尽可能多的重复直至达到上限。如果这个量词后面还有一个额外的后缀?,那么则趋向于进行懒惰性匹配,即试图匹配尽可能少的必要重复。一般情况下最好坚持使用贪婪性匹配。