Javascript正则表达式-表达式操作

206 1 年前
一种几乎可以在所有的程序设计语言里和所有的计算机平台上使用的文字处理工具。它可以用来查找特定的信息(搜索),也可以用来查找并编辑特定的信息(替换)。核心是 匹配,匹配位置或者匹配字符

表达式操作,在这里是指和表达式相关的方法,我们将介绍六个方法。

正则表达式对象(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' ]
分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6