regexp实例方法
exec()
- exec()是专门为捕获组设计的方法,exec接受一个参数,即需要应用正则的字符串,返回一个数组,或者没有匹配的时候返回null。注:/^/.exec(‘str’)返回一个数组,第一项为”。因为在’str’中在字符串开始的地方存在^,不算没有匹配。
-
exec()返回的数组格式:[‘总匹配字符串’,捕获1,捕获2…,index,input],其中如果没有捕获组,数组中就没有捕获项,如果有捕获组,但是没有捕获到字符,则数组中对应的捕获项为undefined。这是一个Array的实例,但是有两个额外的属性:index 表示匹配项在字符串中的位置,而 input 表示应用正则表达式的字符串。
注:可以给array添加属性,输出的格式如下:var a = new Array(1,2);a.input = 'a';console.log(a); //[ 1, 2, input: 'a' ]
-
对于 exec()方法而言,即使在模式中设置了全局标志g,它每次也只会返回一个匹配项。在不设置全局标志的情况下,在同一个字符串上多次调用 exec()将始终返回第一个匹配项的信息。而在设置全局标志的情况下,每次调用 exec()则都会在字符串中继续查找新匹配项,并且该正则表达式的lastindex属性会改变
eg:var a = /w/g;var b = 'aawasdadwaaw';for(var i=0;i<3;i++){ console.log(a.lastIndex); console.log(a.exec(b));}//0//[ 'w', index: 2, input: 'aawasdadwaaw' ]//3//[ 'w', index: 8, input: 'aawasdadwaaw' ]//9//[ 'w', index: 11, input: 'aawasdadwaaw' ]
test()
-
test()接受一个字符串参数。在模式与该参数匹配的情况下返回
true;否则,返回 false。在只想知道目标字符串与某个模式是否匹配,但不需要知道其文本内容的 情况下,使用这个方法非常方便。因此,test()方法经常被用在 if 语句中,用法:var text = "000-00-0000";var pattern = /\d{3}-\d{2}-\d{4}/;if (pattern.test(text)){ alert("The pattern was matched.");}
字符串的模式匹配方法
match()
- match函数在非全局情况与exec函数返回结果完全一致,只是match函数是String的实例方法,调用方法为’str’.match(regexp);
-
match函数在全局模式下与exec函数返回结果不同,match会返回所有匹配项组成的一个数组,没有input和index属性,并且仅仅返回整个的匹配项,即忽略正则表达式中的捕获组。
eg: var a = /(w)a/g;var b = 'aawasdadwaaw';for(var i=0;i<3;i++){ console.log(a.lastIndex); console.log(b.match(a));}//0//[ 'wa', 'wa' ]//0//[ 'wa', 'wa' ]//0//[ 'wa', 'wa' ]
search()
- search接受一个正则表达式参数,返回字符串中第一个匹配项的索引,如果没有找到匹配项,返回-1,无论正则表达式是否设置了g标志,都会返回第一个匹配项的索引。
replace()
- replace是字符串替换方法,接受两个参数,匹配的正则表达式(或者一个字符串)和替换用的字符串。
-
如果第二个参数是字符串,可以在字符串中插入特殊的字符序列
$$ $$& 匹配整个模式的子字符串(不是输入的字符串)。与RegExp.lastMatch的值相同$' 匹配的子字符串右边的内容。与RegExp.rightContext的值相同$` 匹配的子字符串左边的内容。与RegExp.leftContext的值相同$n 匹配第n个捕获组的子字符串,其中n等于0~9。例如,$1是匹配第一个捕获组的子字符串,$2是匹配第二个捕获组的子字符串,以此类推。如果正则表达式中没有定义捕获组,则使用空字符串$nn 匹配第nn个捕获组的子字符串,其中nn等于01~99。例如,$01是匹配第一个捕获组的子字符串,$02是匹配第二个捕获组的子字符串,以此类推。如果正则表达式中没有定义捕获组,则使用空字符串
注:javascript高级程序设计第三版将$’与$`的用法写反了。
-
如果第二个参数是函数,在只有一个匹配项(即与模式匹配的字符串)的情况下,会向这个函数传递 3 个参数:模式的匹配项、模式匹配项在字符串中的位置和原始字符串。在正则表达式中定义了多个捕获组的情况下,传递给函数的参数依次是模式的匹配项、第一个捕获组的匹配项、第二个捕获组的匹配项……,但最后两个参数仍然分别是模式的匹配项在字符串中的位置和原始字符串。这个函数应该返回一个字符串,表示应该被替换的匹配项。
在全局模式下,会一次次调用这个函数,直到这个字符串处理完成。
split()
-
split方法也可以指定正则表达式,并且还可以设置第二个参数来指定返回的项数。
高程上的例子:var colorText = "red,blue,green,yellow";var colors1 = colorText.split(","); //["red", "blue", "green", "yellow"]var colors2 = colorText.split(",", 2); //["red", "blue"]var colors3 = colorText.split(/[^\,]+/); //["", ",", ",", ",", ""]