js正则函数match、exec、test、search、replace、split使用介绍

match()

使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。

stringObj.match(rgExp)

stringObj 
必选项。对其进行查找的 String 对象或字符串文字。 
rgExp 
必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。 
其余说明与exec一样,不同的是如果match的表达式匹配了全局标记g将出现所有匹配项,而不用循环,但所有匹配中不会包含子匹配项。

 //stringObj.match(rgExp)
//stringObj:必选项。对其进行查找的 String 对象或字符串文字。
//rgExp:必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。
function MatchDemo(){
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain";
re = /(a)in/ig; // 创建正则表达式模式。
r = s.match(re); // 尝试去匹配搜索字符串。
document.write(r); // 返回的数组包含了所有 "ain" 出现的四个匹配,r[0]、r[1]、r[2]、r[3]。 // 但没有子匹配项a。
document.write(r instanceof Array)
}
MatchDemo();
//match匹配返回的是一个数组,如果匹配为空,则返回null

exec() 
用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null。 

rgExp.exec(str)

rgExp 
必选项。包含正则表达式模式和可用标志的正则表达式对象。 
str 
必选项。要在其中执行查找的 String 对象或字符串文字。 
返回数组包含: 
input:整个被查找的字符串的值; 
index:匹配结果所在的位置(位); 
lastInput:下一次匹配结果的位置; 
arr:结果值,arr[0]全匹配结果,arr[1,2...]为表达式内()的子匹配,由左至右为1,2...。

 //rgExp.exec(str)
//参数
//rgExp
//必选项。包含正则表达式模式和可用标志的正则表达式对象。
//str
//必选项。要在其中执行查找的 String 对象或字符串文字。
//返回数组包含:
//input:整个被查找的字符串的值;
//index:匹配结果所在的位置(位);
//lastInput:下一次匹配结果的位置;
//arr:结果值,arr[0]全匹配结果,arr[1,2...]为表达式内()的子匹配,由左至右为1,2...。
function RegExpTest(){
var src="http://sumsung753.blog.163.com/blog/I love you!";
var re = /\w+/g; // 注意g将全文匹配,不加将永远只返回第一个匹配。
var arr;
while((arr = re.exec(src)) !=null){ //exec使arr返回匹配的第一个,while循环一次将使re在g作用寻找下一个匹配。
console.dir(arr);
document.write(arr.index + "-" + arr.lastIndex + ":" + arr + "<br/>");
//arr.lastIndex 貌似只有ie678有用,其他的浏览器都返回undefined
for(key in arr){
document.write(key + "=>" + arr[key] + "<br/>");
}
document.write("<br/>");
}
}
RegExpTest();

test()
返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式。

rgexp.test(str) 
rgexp 
必选项。包含正则表达式模式或可用标志的正则表达式对象。 
str 
必选项。要在其上测试查找的字符串。 
说明 
test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false。

 // test 方法
// 返回一个 Boolean 值,它指出在被查找的字符串中是否匹配给出的正则表达式。
// rgexp.test(str)
// 参数
// rgexp
// 必选项。包含正则表达式模式或可用标志的正则表达式对象。
// str
// 必选项。要在其上测试查找的字符串。
// 说明
// test 方法检查字符串是否与给出的正则表达式模式相匹配,如果是则返回 true,否则就返回 false。
function TestDemo(re, s){
var s1;
if (re.test(s))
{ s1 = " 匹配正则式 ";
}
else
{
s1 = " 不匹配正则式 ";
}
return("'" + s + "'" + s1 + "'"+ re.source + "'");
}
document.write(TestDemo(/ab/,'abs'));

注意:test()继承正则表达式的lastIndex属性,表达式在匹配全局标志g的时候须注意。 

 function testDemo(){
var r, re; // 声明变量。
var s = "I";
re = /I/ig; // 创建正则表达式模式。
document.write(re.lastIndex + "<br/>");
document.write(re.test(s) + "<br/>"); // 返回 Boolean 结果。
document.write(re.lastIndex + "<br/>");
document.write(re.test(s) + "<br/>");
document.write(re.lastIndex + "<br/>");
document.write(re.test(s) + "<br/>");
re.lastIndex = 0;
document.write(re.test(s));
}
testDemo(); //0,true,1,false,0,true,true

输出结果:

0
true
1
false
0
true
true

当第二次调用test()的时候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等于第三次又重新匹配。

第10行,重新设定了lastIndex,所以第12行输出true

search()

返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。 
stringObj.search(rgExp) 
stringObj 
必选项。要在其上进行查找的 String 对象或字符串文字。 
rgExp 
必选项。包含正则表达式模式和可用标志的正则表达式对象。 
说明:如果找到则返回子字符至开始处的偏移位,否则返回-1。 

 function SearchDemo(){
var r, re; // 声明变量。
var s = "The rain in Spain falls mainly in the plain.";
re = /falls/i; // 创建正则表达式模式。
re2 = /tom/i;
r = s.search(re); // 查找字符串。
r2 = s.search(re2);
return("r:" + r + ";r2:" + r2); // 返回 Boolean 结果。
}
document.write(SearchDemo()); //r:18;r2:-1

replace()
返回根据正则表达式进行文字替换后的字符串的复制。 
stringObj.replace(rgExp, replaceText)

stringObj 
必选项。要执行该替换的 String 对象或字符串文字。该字符串不会被 replace 方法修改。 
rgExp 
必选项。为包含正则表达式模式或可用标志的正则表达式对象。也可以是 String 对象或文字。如果 rgExp 不是正则表达式对象,它将被转换为字符串,并进行精确的查找;不要尝试将字符串转化为正则表达式。 
replaceText 
必选项。是一个String 对象或字符串文字,对于stringObj 中每个匹配 rgExp 中的位置都用该对象所包含的文字加以替换。在 Jscript 5.5 或更新版本中,replaceText 参数也可以是返回替换文本的函数。 
说明 
replace 方法的结果是一个完成了指定替换的 stringObj 对象的复制。意思为匹配的项进行指定替换,其它不变作为StringObj的原样返回。 
ECMAScript v3 规定,replace() 方法的参数 replacement 可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有 0 个或多个这样的参数。接下来的参数是一个整数,声明了匹配在 stringObject 中出现的位置。最后一个参数是 stringObject 本身。结果为将每一匹配的子字符串替换为函数调用的相应返回值的字符串值。函数作参可以进行更为复杂的操作。

 function f2c(s) {
var test = /(\d+(\.\d*)?)F\b/g; // 说明华氏温度可能模式有:123F或123.4F。注意,这里用了g模式
return (s.replace (test, function(Regstr,$1,$2,$3,newstrObj) {
return(("<br/>" + Regstr +"<br/>" + ($1-32) * 1/2) + "C" +"<br/>" + //以下两行进行替换
$2 +"<br/>" + $3 +"<br/>" + newstrObj +"<br/>" );
}
)
);
}
document.write(f2c("Water: 32.2F and Oil: 20.30F."));

split() 
将一个字符串分割为子字符串,然后将结果作为字符串数组返回。 
stringObj.split([separator[, limit]]) 
参数 
stringObj 
必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。 
separator 
可选项。字符串或 正则表达式 对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。 
limit 
可选项。该值用来限制返回数组中的元素个数。 
说明 
split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解。separator 不作为任何数组元素的部分返回。

 function SplitDemo(){
var s, ss;
var s = "The rain in Spain falls mainly in the plain.";
// 正则表达式,用不分大不写的s进行分隔。
ss = s.split(/s/i);
return(ss);
}
document.write(SplitDemo());

 后记

1、RegExp的exec()方法,有一个字符串参数,返回一个数组,数组的第一个条目是第一个匹配;其他的是反向引用。所以第一个返回的结果是第一个匹配的值es(不区分大小写)。

2、String对象有一个match()方法,它返回一个包含在字符串中所有匹配的数据。这个方法调用string对象,同时传给它一个RegExp对象。所以第二个弹出语句返回的是所有符合正则表达式的数组。

3、search()的字符串方法与indexOf()有些类似,但是它使用一个RegExp对象而非仅仅一个子字符串。search()方法返回第一个匹配值的位置。所以第三处弹出的是“1”,即第二个字符就匹配了。注意的是search()方法不支持全局匹配正规表达式(带参数g)。

上一篇:BZOJ 1188: [HNOI2007]分裂游戏(multi-nim)


下一篇:JavaScript中正则表达式test()、exec()、match() 方法