乐趣区

JavaScript红宝书笔记六RegExp类型

1.var someDate = new Date(Date.parse(“May 25, 2004”)); 可用来计算时间差

// 取得开始时间
var start = Date.now();
// 调用函数
doSomething();
// 取得停止时间
var stop = Date.now(),
result = stop – start;

new Date()也行,不过需要转换成字符串来计算

2. 创建正则表达式:

var expression = / pattern / flags ;
var pattern1 = /[bc]at/i;

var pattern2 = new RegExp("[bc]at", "i");

正则表达式可以带有一个或多个标志:

g:表示全局(global)模式,即模式将被应用于所有字符串,而非在发现第一个匹配项时立即
停止;
i:表示不区分大小写(case-insensitive)模式,即在确定匹配项时忽略模式与字符串的大小写;
m:表示多行(multiline)模式,即在到达一行文本末尾时还会继续查找下一行中是否存在与模
式匹配的项。

/*
* 匹配字符串中所有 "at" 的实例
*/
var pattern1 = /at/g;
/*
* 匹配第一个 "bat" 或 "cat",不区分大小写
*/
var pattern2 = /[bc]at/i;
/*
* 匹配所有以 "at" 结尾的 3 个字符的组合,不区分大小写
*/
var pattern3 = /.at/gi;

3. 由于 RegExp 构造函数的模式参数是字符串,所有元字符都必须双重转义

/\[bc\]at/             "\\[bc\\]at"
/\.at/                 "\\.at"
/name\/age/            "name\\/age"
/\d.\d{1,2}/           "\\d.\\d{1,2}"
/\w\\hello\\123/       "\\w\\\\hello\\\\123"

4. 正则表达式字面量始终会共享同一个 RegExp 实例,而使用构造函数创建的每一个新 RegExp 实例都是一个新实例

var re = null,
    i;
for (i=0; i < 10; i++){
    re = /cat/g;
    re.test("catastrophe");
}
for (i=0; i < 10; i++){re = new RegExp("cat", "g");
    re.test("catastrophe");
}

在第一个循环中,即使是循环体中指定的,但实际上只为 /cat/ 创建了一个 RegExp 实例。由于实例属性不会重置,所以在循环中再次调用 test()方法会失败。这是因为第一次调用 test()找到了 ”cat”,但第二次调用是从索引为 3 的字符(上一次匹配的末尾)开始的,所以就找不到它了。由于会测试到字符串末尾,所以下一次再调用 test()就又从开头开始了。
第二个循环使用 RegExp 构造函数在每次循环中创建正则表达式。因为每次迭代都会创建一个新的 RegExp 实例,所以每次调用 test()都会返回 true

5.RegExp 实例属性:
RegExp 的每个实例都具有下列属性,通过这些属性可以取得有关模式的各种信息。
global:布尔值,表示是否设置了 g 标志。
ignoreCase:布尔值,表示是否设置了 i 标志。
lastIndex:整数,表示开始搜索下一个匹配项的字符位置,从 0 算起。
multiline:布尔值,表示是否设置了 m 标志。
source:正则表达式的字符串表示,按照字面量形式而非传入构造函数中的字符串模式返回。

6.RegExp 实例方法:

RegExp 对象的主要方法是 exec(),该方法是专门为捕获组而设计的
var text = "mom and dad and baby";
var pattern = /mom(and dad( and baby)?)?/gi;
var matches = pattern.exec(text);
alert(matches.index); // 0
alert(matches.input); // "mom and dad and baby"
alert(matches[0]); // "mom and dad and baby"
alert(matches[1]); // "and dad and baby"
alert(matches[2]); // "and baby"

其中,index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串

正则表达式的第二个方法是 test(),它接受一个字符串参数。在模式与该参数匹配的情况下返回 true;否则,返回 false。
var text = "000-00-0000";
var pattern = /\d{3}-\d{2}-\d{4}/;
if (pattern.test(text)){alert("The pattern was matched.");
}
退出移动版