match 方法
使用正则表达式模式对字符串执行查找,并将包含查找的结果作为数组返回。 stringObj.match(rgExp) 参数 stringObj 必选项。对其进行查找的 String 对象或字符串文字。 rgExp 必选项。为包含正则表达式模式和可用标志的正则表达式对象。也可以是包含正则表达式模式和可用标志的变量名或字符串文字。 其余说明与exec一样,不同的是如果match的表达式匹配了全局标记g将出现所有匹配项,而不用循环,但所有匹配中不会包含子匹配项。 例子1: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。 }
exec 方法
用正则表达式模式在字符串中查找,并返回该查找结果的第一个值(数组),如果匹配失败,返回null。 rgExp.exec(str) 参数 rgExp 必选项。包含正则表达式模式和可用标志的正则表达式对象。 str 必选项。要在其中执行查找的 String 对象或字符串文字。 返回数组包含: input:整个被查找的字符串的值; index:匹配结果所在的位置(位); lastInput:下一次匹配结果的位置; arr:结果值,arr[0]全匹配结果,arr[1,2...]为表达式内()的子匹配,由左至右为1,2...。 例子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作用寻找下一个匹配。 document.write(arr.index + "-" + arr.lastIndex + ":" + arr + ""); for(key in arr){ document.write(key + "=>" + arr[key] + ""); } document.write(""); } } 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 说明:根据手册,exec只返回匹配结果的第一个值,比如上例如果不用while循环,将只返回'I'(尽管i空格后的love和you都符合表达式),无论re表达式用不用全局标记g。但是如果为正则表达式设置了全局标记g,exec 从以 lastIndex 的值指示的位置开始查找。如果没有设置全局标志,exec 忽略 lastIndex 的值,从字符串的起始位置开始搜索。利用这个特点可以反复调用exec遍历所有匹配,等价于match具有g标志。 当然,如果正则表达式忘记用g,而又用循环(比如:while、for等),exec将每次都循环第一个,造成死循环。 exec的输出将包含子匹配项。 例子3: 复制代码 代码如下:
function execDemo(){ var r, re; // 声明变量。 var s = "The rain in Spain falls mainly in the plain"; re = /[\w]*(ai)n/ig; r = re.exec(s); document.write(r + ""); for(key in r){ document.write(key + "-" + r[key] + ""); } } window.onload = execDemo();
复制代码 代码如下:
function TestDemo(re, s){ var s1; if (re.test(s)) s1 = " 匹配正则式 "; else s1 = " 不匹配正则式 "; return("'" + s + "'" + s1 + "'"+ re.source + "'"); } window.onload = document.write(TestDemo(/ab/,'cdef'));
代码如下:
function testDemo(){ var r, re; // 声明变量。 var s = "I"; re = /I/ig; // 创建正则表达式模式。 document.write(re.test(s) + ""); // 返回 Boolean 结果。 document.write(re.test(s) + ""); document.write(re.test(s)); } testDemo();
代码如下:
function testDemo(){ var r, re; // 声明变量。 var s = "I"; re = /I/ig; // 创建正则表达式模式。 document.write(re.test(s) + ""); // 返回 Boolean 结果。 document.write(re.lastIndex); // 返回 Boolean 结果。 } testDemo();
输出:
true 1 解决方法:将test()的lastIndex属性每次重新指向0,re.lastIndex = 0; search 方法 返回与正则表达式查找内容匹配的第一个子字符串的位置(偏移位)。 stringObj.search(rgExp) 参数 stringObj 必选项。要在其上进行查找的 String 对象或字符串文字。 rgExp 必选项。包含正则表达式模式和可用标志的正则表达式对象。 说明:如果找到则返回子字符至开始处的偏移位,否则返回-1。 例子6: 复制代码 代码如下:
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());
复制代码 代码如下:
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(("" + Regstr +"" + ($1-32) * 1/2) + "C" +"" + //以下两行进行替换 $2 +"" + $3 +"" + newstrObj +"" ); } ) ); } document.write(f2c("Water: 32.2F and Oil: 20.30F."));
复制代码 代码如下:
function f2c(s) { var test = /(\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.2F and Oil: 20.30F."));
复制代码 代码如下:
function f2c(s) { var test = /([\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"));
复制代码 代码如下:
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());
先看代码:
var sToMatch = "test, Tes, tst, tset, Test, Tesyt, sTes";
var reEs = /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)。