表达式操作,在这里是指和表达式相关的方法,我们将介绍六个方法。
正则表达式对象(RegExp)方法:
一、exec(str)
返回str中与表达式相匹配的第一个字符串,而且以数组的形 式表现,当然如果表达式中含有捕捉用的小括号,则返回的数组中也可能含有()中的匹配字符串,例如:
var regx=/\d+/;
var rs=regx.exec("3432ddf53"); //rs:[ '3432', index: 0, input: '3432ddf53' ]
var regx2=new RegExp(/ab(\d+)c/);
var rs2=regx2.exec("ab234c44"); //rs2:[ 'ab234c', '234', index: 0, input: 'ab234c44' ]
如果 exec()
找到了匹配的文本,则返回一个结果数组。否则,返回 null。此数组的第 0 个元素是与正则表达式相匹配的文本,第 1 个元素是与 RegExpObject 的第 1 个子表达式相匹配的文本(如果有的话),第 2 个元素是与 RegExpObject 的第 2 个子表达式相匹配的文本(如果有的话),以此类推。除了数组元素和 length 属性之外,exec()
方法还返回两个属性。index 属性声明的是匹配文本的第一个字符的位置。input 属性则存放的是被检索的字符串 string。我们可以看得出,在调用非全局的 RegExp 对象的 exec()
方法时,返回的数组与调用方法 String.match()
返回的数组是相同的。
但是,当 RegExpObject 是一个全局正则表达式时,exec()
的行为就稍微复杂一些。它会在 RegExpObject 的 lastIndex
属性指定的字符处开始检索字符串 string。当 exec()
找到了与表达式相匹配的文本时,在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。这就是说,您可以通过反复调用 exec()
方法来遍历字符串中的所有匹配文本。当 exec()
再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
另外,如果有多个合适的匹配,则第一次执行exec返回一个第一个匹配,此时继续执行exec,则依次返回第二个第三个匹配。例如:
//如果regx不是全局(g),每次执行exec都是返回第一次的匹配
var regx=/user\d/g;
var rs=regx.exec("ddduser1dsfuser2dd");
console.log(rs); //[ 'user1', index: 3, input: 'ddduser1dsfuser2dd' ]
var rs1=regx.exec("ddduser1dsfuser2dd");
console.log(rs1); //[ 'user2', index: 11, input: 'ddduser1dsfuser2dd' ]
注意regx中的g参数是必须 的,否则无论exec执行多少次,都返回第一个匹配。
如果是全局(g)匹配,在一个字符串中完成了一次模式匹配之后要开始检索新的字符串,就必须手动地把 lastIndex 属性重置为 0。
var regx=/user\d/g;
var rs=regx.exec("ddduser1dsfuser2dd");
console.log(rs);//[ 'user1', index: 3, input: 'ddduser1dsfuser2dd' ]
console.log(regx.lastIndex);//8
var rs1=regx.exec("user3dsfuser4dd");
console.log(rs1);//[ 'user4', index: 8, input: 'user3dsfuser4dd' ]
console.log(regx.lastIndex);//13
从上面可以看到regx.exec
执行完后下一次执行的开始位置lastIndex
改变了,而去匹配另一个字符串时又是从这个位置开始,所以需手动设置lastIndex
为0。如果不是全局(g)匹配lastIndex
属性都为0
。
var someText="web2.0 .net2.0";
var pattern=/(\w+)(\d)\.(\d)/g;
var outCome_exec=pattern.exec(someText);
var outCome_matc=someText.match(pattern);
console.log(outCome_exec); //[ 'web2.0', 'web', '2', '0', index: 0, input: 'web2.0 .net2.0' ]
console.log(outCome_matc); //[ 'web2.0', 'net2.0' ]
二、test(str)
判断字符串str是否匹配表达式,返回一个布尔值。
例如:
var regx=/user\d+/g;
var flag=regx.test("user12dd");
console.log(flag); //true
String对象方法
一、match(expr)
返回与expr相匹配的一个字符串数组,如果没有加参数g,则返回第一个匹配,加入参数g则返回所有的匹配,若没有找到任何匹配的子串,则返回 null
例子:
var regx=/user\d/g;
var str="user13userddduser345";
var rs=str.match(regx);
console.log(rs);//[ 'user1', 'user3' ]
rs的值为:[ 'user1', 'user3' ]
如果匹配模式 regx 不是全局的会是什么情况呢?
var regx=/user\d/;
var str="user13userddduser345";
var rs=str.match(regx);
console.log(rs);//[ 'user1', index: 0, input: 'user13userddduser345' ]
如果在上面不是全局匹配中加上捕获呢?
var regx=/(user)\d/;
var str="user13userddduser345";
var rs=str.match(regx);
console.log(rs);//[ 'user1', 'user', index: 0, input: 'user13userddduser345' ]
var regx=/(user)\d/g;
var str="user13userddduser345";
var rs=str.match(regx);
console.log(rs); //[ 'user1', 'user3' ]
所以,当字符串的 match(expr)
不是全局匹配时,得到的结果跟正则表达式 exec(str)
返回的结果是一样。如果是全局匹配, match(regx)
返回所有匹配的数组(不管捕获子表达式)。
二、search(expr)
返回字符串中与expr相匹配的第一个匹配的index值。如果没有匹配否则返回-1
例子:
var regx=/user\d/g;
var str="aauser13userddduser345";
var rs=str.search(regx);
console.log(rs); //2
三、replace(expr,str)
将字符串中匹配expr的部分替换为str。返回一个新的字符串。另外在replace方法中,str中可以含有一种变量符号$,格式为$n,代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
例子:
var regx=/user\d/g;
var str="user13userddduser345";
var rs=str.replace(regx,"00");
console.log(str); //user13userddduser345
console.log(rs); //003userddd0045
例子2:
var regx=/u(se)r\d/g;
var str="user13userddduser345";
var rs=str.replace(regx,"$1");
console.log(rs); //se3userdddse45
对于replace(expr,str)
方法还要特别注意一点,如果expr是一个表达式对象则会进行全局替换(此时表达式必须附加参数g,否则也只是替换第一个匹配),如果expr是一个字符串对象,则只会替换第一个匹配的部分(因为没有全局的概念)。
例如:
var regx="user"
var str="user13userddduser345";
var rs=str.replace(regx,"00");
console.log(rs);//0013userddduser345
更多关于 replace 的内容,请访问 《Javascript string对象replace方法详解》一文
四、split(expr)
将字符串以匹配expr的部分做分割,返回一个数组,而且表达式是否附加参数g都没有关系,结果是一样的。
例子:
var regx=/user\d/g;
var str="user13userddduser345";
var rs=str.split(regx);
console.log(rs);//[ '', '3userddd', '45' ]