RegExp相关的几个方法

以下对与正则配套的几个常用方法稍作总结

RegExp实例方法

test()方法

这个方法很简单,仅仅检测目标字符串是否能与某个模式匹配, 匹配则返回true; 不匹配返回false. 如果正则表达式reg中添加了全局标识g, 对lastIndex是有影响的; 下一次再使用test()会从lastIndex表示的位置开始查找

var str = "sam12";
var reg = /\d+/g;
console.log(reg.test(str)); // 返回true

exec()方法

这个方法很强大...举例:

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/g;
console.log(reg.exec(str), reg.lastIndex);  // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 4
console.log(reg.exec(str), reg.lastIndex);  // ["f4", "f", index: 8, input: "abc123def456htg789wsx304"] 10
console.log(reg.exec(str), reg.lastIndex);  // ["g7", "g", index: 14, input: "abc123def456htg789wsx304"] 16
console.log(reg.exec(str), reg.lastIndex);  // ["x3", "x", index: 20, input: "abc123def456htg789wsx304"] 22
console.log(reg.exec(str), reg.lastIndex);  // null 0
console.log(reg.exec(str), reg.lastIndex);  // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 4
console.log(reg.exec(str), reg.lastIndex);  // ["f4", "f", index: 8, input: "abc123def456htg789wsx304"] 10

exec()方法返回的是一个包含匹配项信息的数组, 这个数组的第一项是与整个模式匹配的字符串; 第二项开始是捕获到的与子正则表达式相匹配的字符串(如果存在子正则表达式的话). 此外, 这个数组还包含两个额外属性, index和input; index指的是匹配项在整个字符串中的位置; input指的是应用正则表达式的字符串.

上面的例子中, 每调用一次exec方法,都会向后查找到新的匹配项, 一直到null; 然后又从头开始查找; 原因是我们在正则表达式reg中添加了全局标识g; 只要设置了全局标识g, 每次调用时RegExp的lastIndex值都会增加, 下一次对同一个字符串调用exec()查找时会从lastIndex指示的位置开始查找; 查找不到的时候lastIndex会归零, 然后从头查起.

如果没有加全局标识g, 则调用exec()时lastIndex一直是0, 不会向后查找新的匹配项.

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/;
console.log(reg.exec(str), reg.lastIndex); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 0
console.log(reg.exec(str), reg.lastIndex); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 0
console.log(reg.exec(str), reg.lastIndex); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 0
console.log(reg.exec(str), reg.lastIndex); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 0

使用exec方法时, 如果使用循环, 会比连续使用exec()方法方便;

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/g;
var arr;
while (arr = reg.exec(str)) {
    console.log(arr);
}

String类型方法

match()方法

这个方法, 如果不给正则加全局标识符g, 和不加g的exec()方法其实没差:

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/;
console.log(str.match(reg)); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"]
console.log(str.match(reg)); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"]

如果加了全局标识符g, 则会一次返回所有的匹配项; 但不会返回子正则的匹配项, 也不会包含index和input信息;

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/g;
console.log(str.match(reg), reg.last);  // ["c1", "f4", "g7", "x3"]

split()方法

这是字符串分割成数组的方法, 接受正则作为参数, 返回分割后的数组

var str = "2013-11-2 12:34:36";
var reg = /[ :-]/g;
str.split(reg);  // ["2013", "11", "2", "12", "34", "36"]

search()方法

返回正则表达式第一次匹配的位置; 这个方法忽略全局标识g, 也无视index; 因此返回的一定是第一次匹配的位置;

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/g;
console.log(str.search(reg), reg.lastIndex); // ["c1", "c", index: 2, input: "abc123def456htg789wsx304"] 0

replace()方法

这是最常用的方法, 很强大.

var str = "abc123def456htg789wsx304";
var reg = /([a-z])\d/g;
str = str.replace(reg, function() {
    return "(" + arguments[0]+ ")";
});
console.log(str);  //  ab(c1)23de(f4)56ht(g7)89ws(x3)04

replace()方法接收两个参数, 第一个参数可以是需要被替换的字符串, 也可以是正则; 第二个参数可以是要替换成的字符串, 也可以是函数; 函数的参数是和exec()方法返回的数组内容对应的: 第一个参数是与整个模式匹配的字符串; 第二个开始是捕获到的与子正则表达式相匹配的字符串(如果存在子正则表达式的话). 最后两个是index和input; index指的是匹配项在整个字符串中的位置; input指的是应用正则表达式的字符串. 在有全局标识g的情况下, 正则捕获到多少匹配项, 函数就会执行相应的次数. 因此replace()不像exec()那样需要使用循环取得所有匹配项.

posted @ 2015-07-15 15:29  supersylph  阅读(161)  评论(0编辑  收藏  举报