JavaScript语言精粹 笔记05 正则表达式

正则表达式

正则表达式以方法的形式被用于对字符串中的信息进行查找、替换画图提取操作。可处理正则表达式的方法有:regexp.exec, regexp.test,string.match, string.replace, string.search, 和string.split。

结构

有两个方法来创建一个RegExp对象。优先方法是使用正则表达式字面量。正则表达式被包围在一对斜杠中。有3个标志能在RegExp中设置,分别为g、i、m。

// 构造一个匹配JavaScript字符串的正则表达式对象

var my_regexp = /"(?:\\.|[^\\\"])*"/g;

G:全局的(匹配多次;准确含有随方法而变)

I:大小写不敏感(忽略字符大小写)

M:多行(^和$能匹配行结束符)

创建正则表达式的另一个方法是使用RegExp构造器。这个构造器接收一个字符串,并把它编译为一个RegExp对象。第二个参数是一个指定标志的字符串。

// 构造一个匹配JavaScript字符串的正则表达式对象.

var my_regexp = new RegExp("\"(?:\\\\.|[^\\\\\\\"])*\"", ‘g‘);

RegExp对象的属性:

global:如果标志g被使用,值为true

ignoreCase:如果标记 i 被使用,值为true

lastIndex:下一次exec匹配开始的索引。初始值为0

multiline:如果标志 m 被使用,值为true

source:正则表达式源代码文本

用正则表达式字面量创建的RegExp对象来共享一个单实例:

function make_a_matcher() {
    return /a/gi;
}

var x = make_a_matcher();
var y = make_a_matcher();

//注意:x 和 y 是相同的对象

x.lastIndex = 10;

document.writeln(y.lastIndex);    // 10

元素

正则表达式选择

正则表达式选择包含1个或者多个表达式序列。这些序列被|(竖线)隔开。如果这些序列中的任何一项符合匹配条件,那么这个选择就被匹配。它尝试按顺序匹配这些序列项。

"into".match(/in|int/);

将在into中匹配in,但它不会匹配int,因为in已经匹配成功了。

正则表达式序列

一个正则表达式序列包含1个或者多个正则表达式因子.每个因子能够选择是否跟随一个量词,这个量词决定着这个因子被允许出现的次数。如果没有指定这个量词,那么该因子将被匹配一次。

正则表达式因子

一个正则表达式因子可以是一个字符、一个由圆括号包围的组、一个字符类,或者是一个转义序列。除了控制字符和特殊字符以外,所有的字符都将被按照字面处理。

\ / [ ] ( ) { } ? + * | . ^ $

如果你希望上面列出的字符按照字面去匹配,那么必须使用一个 \ 前缀来进行转义。当你存在疑虑时,可以给任何特殊字符都添加一个 \ 前缀使其字面化。 \ 前缀不能使字母或数字字面化。

一个未被转义的 . 将匹配除行结束符以外的任何字符。

当lastIndex的属性值为0时,一个未转义的^将匹配该文本的开始。当指定了 m 标识时,它也能匹配结束符。

一个未转义的$将匹配该文本的结束。当指定了 m 标识时,它也能匹配结束符。

正则表达式转义

\ 在正则表达式中表示转义。

\f  换页符

\n 换行符

\r 回车符

\t 制表符

\u 允许指定一个Unicode字符来表示一个十六进制的常量。

\d 等同于[0-9]

\D 等同于[^0-9]

\s 等同于[\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]

\S 等同于[^\f\n\r\t\u000B\u0020\u00A0\u2028\u2029]

\w 等同于[0-9A-Z_a-z]

\W 等同于[^0-9A-Z_a-z]

\b 被指定为一个字边界标志,但是他使用\w 去寻找字边界,所以它对多数语言应用来说是完全无用的。

\1 是指向分组1所捕获到的文本的引用,所以它能够被再次匹配。例如:

  var doubled_words = /([A-Za-z\u00C0-\u1FFF\u2800-\uFFFD]+)\s+\1/gi;

doubled_words将寻找连续的重复单纯(包含一个或多个字母的字符串),该单词后面跟着一个或多个空白,然后再跟着与它相同的单词。\2 是指向分组2所捕获到的文本的引用,\3 是指向分组3所捕获到的文本的引用,依此类推。

正则表达式分组

分组共有4种

  捕获型

一个捕获型分组是一个被包围在括号中的正则表达式选择。任何匹配这个分组的字符将被捕获。每个捕获型分组都被指定了一个数字。正则表达式第一个捕获 ( 的是分组1,第二个捕获 ( 的是分组2。

  非捕获型

非捕获型分组有一个(?:前缀。非捕获型分组仅做简单的匹配,并不会捕获所匹配的文本。这会有微弱的性能优势。非捕获型分组不会干扰捕获型分组的编号。

  向前正相匹配

向前正向匹配分组有一个(?=前缀,它类似于非捕获型分组,但在这个组匹配后,文本将退回到它开始的地方,实际上并不匹配任何东西,这不是一个好的特性。

  向前负向匹配

向前负向匹配分组有一个(?!前缀,它类似于向前正相匹配分组,但只有它匹配失败是它才进行匹配,这不是一个好的特性。

正则表达式类

正则表达式类是一种指定一组字符的便利方式。例如,匹配一个元音字母,可以写作(?:a|e|i|o|u),但它可以被方便地写成一个类[aeiou]。

一组有32个ASCII的特殊字符组成的集合:

  ! " # $ % & ‘ ( ) * +, - . / :; < = > ? @ [ \ ] ^ _ ` { | } ˜

可以被写为:

  (?:!|"|#|\$|%|&|‘|\(|\)|\*|\+|,|-|\.|\/|:|;|<|=|>|@|\[|\\|]|\^|_|` |\{|\||\}|˜)

也可以被写为:

  [!-\/:[email protected]\[-`{-˜]

它包括从 ! 到 / 、从 : 到 @ 、从 [ 到 ‘ 和从 { 到 ˜ 的字符。

另一种方便之处是类的求反。[^!-\/:[email protected]\[-`{-˜] 匹配的是任何一个非ASCII特殊字符的字符。

正则表达式类转义

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

- / [ \ ] ^

正则表达式类量词

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

/www/等价于/w{3}/

{3,6}将匹配3,4,5或6次。

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

?等价于{0,1}

*等价于{0,}

+等价于{1,}

如果只有一个量词,则趋于进行贪婪匹配,即匹配尽可能多的重复直到达到上限。如果这个量词还有一个额外的后缀?,那么趋向于懒惰匹配,即试图匹配尽可能少的必要重复。

参考:《JavaScript语言精粹》Douglas Crockford著    赵泽欣 鄢学鹍 译

转载请注明出处:

作者:JesseLZJ
出处:http://jesselzj.cnblogs.com

时间: 09-08

JavaScript语言精粹 笔记05 正则表达式的相关文章

javascript语言精粹----笔记【转载】

javascript语言精粹----笔记 1.6种值会为假(==false),分别是false,null,undefined,' ',0,NaN 2.typeof有6种值,分别是'number','string','boolean','undefined','function','object';其中typeof(null),结果是'object' 3.number类型总是64位浮点数,两个整数相除也可能出现非整数结果 4.如果第一个运算数的值为假,那么运算符&&产生它的第一个运算数的值.

JavaScript语言精粹笔记

JavaScript语言精粹笔记 掌握语言的每个特性可以让你出风头,但是并不推荐,因为一部分的特性带来的麻烦可能远超本身的价值.正如书中所言,坏的材料并不能雕刻出好的作品,要成为一名更好的程序员,要取其精华去其糟粕.当你知道要做什么的时候,它还能表现的更好,编程时一件相对困难的事情,绝不应该在懵懂的状态下开始编程之旅. JS中的注意为//或者/*content*/,注释一定要精确地描述代码,不然没有用的注释比没有注释更糟糕. JS中的代码块不会创建新的作用域,因此变量应该被定义在函数的头部,而不

JavaScript语言精粹 笔记01

内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染  语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有意义,但是偶尔必须用它来分割字符序列,否则它们就会被合并成一个单一的符号.例如: var that = this; var 和that之间的空格是不能去掉的,其他的空格都可以被移除. JS提供两种注释: /* */ // 建议使用//,因为/* */中要注释的内容可能包括字符 */ 而报错,例如:

JavaScript语言精粹 笔记02

函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆   函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字面量产生的对象连接到Object.prototype.函数对象连接到Function.prototype(该原型本身连接到Object.prototype).每个函数在创建时附有两个附加的隐藏属性:函数上下文和实现函数行为的代码. 因为函数是对象,所以它可以像任何其他的值一样被使用.函数可以存放在变

javascript 语言精粹 笔记推荐。。

http://www.cnblogs.com/Cohlint/archive/2012/11/26/2788790.html 这篇javascript 语言精粹 学习笔记不错..不过看上去就是读书笔记,没有深入研究某个点..比如闭包..我还是不懂噢.. 比如17条:“add_the_handles 函数目的是给每个时间处理器一个唯一值(i).它未能达到目的是因为事件处理器函数绑定了变量i,而不是函数在构造时的变量i的值.” 这是原书的翻译过来的理解,但是感觉还是很艰涩,不太理解. 闭包这个变量作

JavaScript语言精粹 笔记06 方法

JS包含了少量可用在标准类型上的标准方法. ArrayFunctionNumberObjectRegExpString Array array.concat(item...) concat方法返回一个新数组,它包含array的浅复制并将1个或多个参数item附加在其后.如果参数item是一个数组,那么他的每个元素会被本别添加. var a = ['a', 'b', 'c']; var b = ['x', 'y', 'z']; var c = a.concat(b, true); // c 是 [

JavaScript语言精粹 笔记03

继承伪类对象说明符原型函数化部件 继承 JS不是基于类的,而是基于原型的,这意味着对象直接从其他对象继承. 1 伪类 JS提供了一套丰富的代码重用模式,它可以模拟那些基于类的模式,因为JS实际上没有类,所以把模拟的类称为伪类.我们可以定义一个构造器并扩充它的原型: var Mammal = function (name) { this.name = name; }; Mammal.prototype.get_name = function ( ) { return this.name; }; M

JavaScript语言精粹 笔记04 数组

数组1 数组字面量2 长度3 删除4 列举5 混淆的地方6 方法7 维度 数组1 数组字面量 var empty = []; var numbers = [ 'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine' ]; empty[1] // undefined numbers[1] // 'one' empty.length // 0 numbers.length // 10 数组字面量可以出

JavaScript语言精粹读书笔记- JavaScript对象

JavaScript 对象 除了数字.字符串.布尔值.null.undefined(都不可变)这5种简单类型,其他都是对象. JavaScript中的对象是可变的键控集合(keyed collections). 对象是属性的容器,其中每个属性都拥有名字和值. JavaScript中的对象是无类别的(class-free)的.它对新属性的名字和值没有约束. JavaScript包括一个原型链特性,允许对象继承另一对象的属性. 对象的检索: stooge[“first-name”]或者stooge.