操作正则表达式执行匹配工作的对象:RegExp对象和String对象,
接下来分别介绍一下两个对象提供正则匹配的方法
1、RegExp对象:可以通过上面两种方式创建正则表达式对象,
它有3个方法:test()、exec() 以及 compile()。
(1)、test():检索字符串中的指定值。返回值是 true 或 false。
例子:
var regx=new RegExp("e");
document.write(regx.test("The best things in life are free"));
由于该字符串中存在字母 "e",以上代码的输出将是:true
(2)、exec():该方法是专门为捕获组而设计的。
返回值:包含第一个匹配项信息的数组,如果未找到匹配,则返回值为 null。
返回的虽然是Array实例,但包含两个额外的属性:
index和input,index表示匹配项在字符串中开始的位置,input表示的是应用正则表达式的字符串。
数组的第一项是与整个模式匹配的字符串,其它项是与模式中捕获组匹配的字符串,
如果模式中没有捕获组,则该数组中只有一项,即与整个模式匹配的字符串。
例子:
var text = "mon and dad and baby,the end.";
var regx= /mon( and dad( and baby)?)?/;
var matches = regx.exec(text);
console.log(matches);//["mon and dad and baby", " and dad and baby", " and baby", index: 0, input: "mon and dad and baby,the end."]或者alert时为mon and dad and baby, and dad and baby, and baby
alert(matches.index);//0
alert(matches.input);//mon and dad and baby,the end. 即text的值:被检索的字符串
alert(matches[0]);//mon and dad and baby 即成功匹配到的字符串
alert(matches[1]);//and dad and baby 即第一个捕获组
alert(matches[2]);//and baby 即第二个捕获组
如果没有捕获组:
var regx=/user\d/g;
var str="user13userddduser345";
var match = regx.exec(str);
console.log(match);//["user1", index: 0, input: "user13userddduser345"]
补充:
当 regx 是一个全局正则表达式时:
1、必须是正则表达式而非普通字符串;
2、必须是全局的,当执行 exec() 找到了与表达式相匹配的文本时,
在匹配后,它将把 RegExpObject 的 lastIndex 属性设置为匹配文本的最后一个字符的下一个位置。
这就是说,您可以通过反复调用 exec() 方法来遍历字符串中的所有匹配文本。
当 exec() 再也找不到匹配的文本时,它将返回 null,并把 lastIndex 属性重置为 0。
简单点就是:匹配模式p1必须是正则表达式,检索条件p2必须有g,然后循环执行,
如果不满足正则表达式且全局的条件,多次执行exec都返回第一个匹配项字符串
例如:
var regx= new RegExp("user\\d","g");
var rs=null;
while((rs=regx.exec("ddduser1dsfuser2dd")) != null){
console.log(rs);
}
则rs的值分别为:
["user1", index: 3, input: "ddduser1dsfuser2dd"]或者alert时为user1、
["user2", index: 11, input: "ddduser1dsfuser2dd"]或者alert时为user2
注:如果没有捕获组,可以直接使用rs的值,即为匹配值,不通过数组方法
如果去掉参数g:
var regx= new RegExp("user\\d");
var rs=null;
while((rs=regx.exec("ddduser1dsfuser2dd")) != null){
console.log(rs);
}
则rs的值分别为:
["user1", index: 3, input: "ddduser1dsfuser2dd"]或者alert时为user1、
["user1", index: 3, input: "ddduser1dsfuser2dd"]或者alert时为user1
循环执行结果一致
(3)、compile():用于在脚本执行过程中编译正则表达式,
也可用于改变和重新编译正则表达式,及添加或删除第二个参数。
格式:RegExpObject.compile(regx,modifier);
参数: regx:正则表达式。
modifier:规定匹配的类型。
"g" 用于全局匹配,
"i" 用于区分大小写,
"gi" 用于全局区分大小写的匹配。
例子:
var str="Every man in the world! Every woman on earth!";
regx=/man/g;
str2=str.replace(regx,"person");
document.write(str2+"<br />");
regx=/(wo)?man/g;
regx.compile(regx);
str2=str.replace(regx,"person");
document.write(str2);
在字符串中全局搜索 "man",并用 "person" 替换。
然后通过 compile() 方法,改变正则表达式,用 "person" 替换 "man" 或 "woman"。
2、String对象:需要使用正则字面量的方式创建正则表达式对象regx,
用以作为String调用相关方法的参数,方法有:match(regx)、search(regx)、replace(regx,str)、split(regx)
(1)、match(regx/searchStr),返回与regx或searchStr相匹配的一个字符串数组,
如果没有加参数g,则返回第一个匹配,以及捕获组匹配项,同时也有额外的input属性和index属性,加入参数g则返回所有的匹配,但不包括捕获组匹配项、index、input属性。
例子:
带有g:
var regx=/us(er)\d/g;
var str="user13userddduser345";
var rs=str.match(regx);
console.log(rs);
rs的值为:["user1", "user3"]
注:这个是和exec()方法不同的地方
如果没有g:
var regx=/us(er)\d/;
var str="user13userddduser345";
var rs=str.match(regx);
console.log(rs);
//["user1", "er", index: 0, input: "user13userddduser345"]或者alert为user1
var rs1=str.match(regx);
console.log(rs1);
//["user1", "er", index: 0, input: "user13userddduser345"]或者alert为user2
注:两次结果一致,这个是与exec()不同的地方
**【注意:在全局检索模式下,match() 即不提供与子表达式匹配的文本的信息,也不声明每个匹配子串的位置。
如果您需要这些全局检索的信息,可以使用 RegExp.exec()。】这样的解释是错误的。**
(2)、search(regx),返回字符串中与regx相匹配的子字符串起始位置的index值。
例子:
var regx=/user\d/g;
var str="user13userddduser345";
var rs=str.search(regx);
rs的值为:0
(3)、replace(regx,str),将字符串中匹配regx的部分替换为str。
另外在replace方法中,str中可以含有一种变量符号$,格式为$n,
代表匹配中被记住的第n的匹配字符串(注意小括号可以记忆匹配)。
例子:
var regx=/user\d/g;
var str="user13userddduser345";
var rs=str.replace(regx,"00");
rs的值为:003userddd0045
例子2:
var regx=/u(se)r\d/g;
var str="user13userddduser345";
var rs=str.replace(regx,"$1");
rs的值为:se3userdddse45
补充:对于replace(regx,str)方法还要特别注意一点,
全局正则替换:如果regx是一个表达式对象则会进行全局替换
(此时表达式必须附加参数g,否则也只是替换第一个匹配),
如果regx是一个字符串对象,则只会替换第一个匹配的部分
例子3:
var regx="user"
var str="user13userddduser345";
var rs=str.replace(regx,"00");
rs的值为: 0013userddduser345
(4)、split(regx),将字符串以匹配regx的部分做分割,返回一个数组,
而且表达式是否附加参数g都没有关系,结果是一样的。
例子:
var regx=/user\d/g;
var str="user13userddduser345";
var rs=str.split(regx);
rs的值为:{3userddd,45}
补充:
(1)、stringObject.split(separator,howmany),
separator也可以是普通字符串,howmany作为可选参数,指定返回的数组的最大长度。
(2)、如果把空字符串 ("") 用作 separator,那么stringObject每个字符之间都会被分割。