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()那样需要使用循环取得所有匹配项.