moll 2012-04-26
js正则函数match、exec、test、search、replace、split使用介绍集合,学习正则表达式的朋友可以参考下
stringObj.match(rgExp) function auth(){ var s = "The rain in Spain falls mainly in the plain"; re = /(a)in/ig; // 创建正则表达式模式。 r = s.match(re); // 尝试去匹配搜索字符串 document.write(r); } 输出结果:ain,ain,ain,ain
rgExp.exec(str) 返回数组包含: input:整个被查找的字符串的值; index:匹配结果所在的位置(位); lastInput:下一次匹配结果的位置; arr:结果值,arr[0]全匹配结果,arr[1,2...]为表达式内()的子匹配,由左至右为1,2...。 例: function Test(){ 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作用寻找下一个匹配。 document.write(arr.index + "-" + arr.lastIndex + ":" + arr + "<br/>"); for(key in arr){ document.write(key + "=>" + arr[key] + "<br/>"); } document.write("<br/>"); } } window.onload = RegExpTest(); 返回结果: 0-1:I //0为index,i所在位置,1为下一个匹配所在位置 input=>I love you! index=>0 lastIndex=>1 0=>I 2-6:love input=>I love you! index=>2 lastIndex=>6 0=>love 7-10:you input=>I love you! index=>7 lastIndex=>10 0=>you
注意:test()继承正则表达式的lastIndex属性,表达式在匹配全局标志g的时候须注意。
例子5:
functiontestDemo(){
varr,re;//声明变量。
vars="I";
re=/I/ig;//创建正则表达式模式。
document.write(re.test(s)+"<br/>");//返回Boolean结果。
document.write(re.test(s)+"<br/>");
document.write(re.test(s));
}
testDemo();
输出结果:
true
false
true
当第二次调用test()的时候,lastIndex指向下一次匹配所在位置1,所以第二次匹配不成功,lastIndex重新指向0,等于第三次又重新匹配。下例显示test的lastIndex属性:
例子6:
functiontestDemo(){
varr,re;//声明变量。
vars="I";
re=/I/ig;//创建正则表达式模式。
document.write(re.test(s)+"<br/>");//返回Boolean结果。
document.write(re.lastIndex);//返回Boolean结果。
}
testDemo();
输出:
true
1
解决方法:将test()的lastIndex属性每次重新指向0,re.lastIndex = 0;如果找到则返回子字符至开始处的偏移位,否则返回-1。
例子6:
functionSearchDemo(){
varr,re;//声明变量。
vars="TheraininSpainfallsmainlyintheplain.";
re=/falls/i;//创建正则表达式模式。
re2=/tom/i;
r=s.search(re);//查找字符串。
r2=s.search(re2);
return("r:"+r+";r2:"+r2);//返回Boolean结果。
}
document.write(SearchDemo());说明
replace方法的结果是一个完成了指定替换的stringObj对象的复制。意思为匹配的项进行指定替换,其它不变作为StringObj的原样返回。
ECMAScriptv3规定,replace()方法的参数replacement可以是函数而不是字符串。在这种情况下,每个匹配都调用该函数,它返回的字符串将作为替换文本使用。该函数的第一个参数是匹配模式的字符串。接下来的参数是与模式中的子表达式匹配的字符串,可以有0个或多个这样的参数。接下来的参数是一个整数,声明了匹配在stringObject中出现的位置。最后一个参数是stringObject本身。结果为将每一匹配的子字符串替换为函数调用的相应返回值的字符串值。函数作参可以进行更为复杂的操作。
例子7:
functionf2c(s){
vartest=/(\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.2FandOil:20.30F."));
输出结果:
Water://不与正则匹配的字符,按原字符输出
32.2F//与正则相匹配的第一个字符串的原字符串Regstr
0.10000000000000142C//与正则相匹配的第一个字符串的第一个子模式匹配的替换结果$1
.2//与正则相匹配的第一个字符串的第二个子模式匹配项的替换结果,这里我们没有将它替换$2
7//与正则相匹配的第一个字符串的第一个子匹配出现的偏移量$3
Water:32.2FandOil:20.30F.//原字符串newstrObj
andOil://不与正则匹配的字符
20.30F//与正则相匹配的第二个字符串的原字符串
-5.85C//与正则相匹配的第二个字符串的第一个子模式与匹配的替换结果
.30//与正则相匹配的第二个字符串的第二个子模式匹配项的替换结果,这里我们没有将它替换
22//与正则相匹配的第二个字符串的第一个子匹配出现的偏移量
Water:32.2FandOil:20.30F.//原字符串
.//不与正则匹配的字符
上面的函数参数我们全部用到了。在实际中,我们只须用将xxF替换为xxC,根据要求,我们无须写这么多参数。
例子8:
functionf2c(s){
vartest=/(\d+(\.\d*)?)F\b/g;//说明华氏温度可能模式有:123F或123.4F
return(s.replace
(test,
function(strObj,$1){
return((($1-32)*1/2)+"C");
}
)
);
}
document.write(f2c("Water:32.2FandOil:20.30F."));
输出:Water:0.10000000000000142CandOil:-5.85C.
更多的应用:
例子9:
functionf2c(s){
vartest=/([\d]{4})-([\d]{1,2})-([\d]{1,2})/;
return(s.replace
(test,
function($0,$1,$2,$3){
return($2+"/"+$1);
}
)
);
}
document.write(f2c("today:2011-03-29"));
输出:today:03/2011
6、split方法:将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
stringObj.split([separator[,limit]])
参数
stringObj
必选项。要被分解的String对象或文字。该对象不会被split方法修改。
separator
可选项。字符串或正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。
limit
可选项。该值用来限制返回数组中的元素个数。
说明
split方法的结果是一个字符串数组,在stingObj中每个出现separator的位置都要进行分解。separator不作为任何数组元素的部分返回。
例子10:
functionSplitDemo(){
vars,ss;
vars="TheraininSpainfallsmainlyintheplain.";
//正则表达式,用不分大不写的s进行分隔。
ss=s.split(/s/i);
return(ss);
}
document.write(SplitDemo());
输出:Therainin,painfall,mainlyintheplain.
js正则表达式之exec()方法、match()方法以及search()方法
先看代码:
var sToMatch = "test, Tes, tst, tset, Test, Tesyt, sTes";
varreEs=/es/gi;
alert(reEs.exec(sToMatch));
alert(sToMatch.match(reEs));
alert(sToMatch.search(reEs));三个弹出框内容如下:
结果分析如下:
1、RegExp的exec()方法,有一个字符串参数,返回一个数组,数组的第一个条目是第一个匹配;其他的是反向引用。所以第一个返回的结果是第一个匹配的值es(不区分大小写)。
2、String对象有一个match()方法,它返回一个包含在字符串中所有匹配的数据。这个方法调用string对象,同时传给它一个RegExp对象。所以第二个弹出语句返回的是所有符合正则表达式的数组。
3、search()的字符串方法与indexOf()有些类似,但是它使用一个RegExp对象而非仅仅一个子字符串。search()方法返回第一个匹配值的位置。所以第三处弹出的是“1”,即第二个字符就匹配了。注意的是search()方法不支持全局匹配正规表达式(带参数g)。