+ -
当前位置:首页 → 问答吧 → 一个关于正则表达式的诡异问题

一个关于正则表达式的诡异问题

时间:2011-12-12

来源:互联网

这个问题我无法理解,为什么,求高人指点,请看代码:
JScript code

var reg=/^(.+?):(.+)$/gi,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
c=s.replace(reg,'$1');
alert(reg.test(s)+' '+reg.source+' '+s);//弹出false ^(.+?):(.+)$ a:a,为什么?????
if(reg.test(s))cfg=s.replace(reg,'$2');


为什么在第一次replace后再测试就为false????

作者: loveajin   发布时间: 2011-12-12

替换之后,你再输出一下s试试看看是多少。

应该是在s的基础上替换,s的值就变了吧。虽然,你又把这个值给了c,但是给c的值应该是你替换之后的s的值。

作者: soonfei   发布时间: 2011-12-12

g去掉呗。。

作者: cj205   发布时间: 2011-12-12

我试了一下,不是这个问题

作者: soonfei   发布时间: 2011-12-12

引用 1 楼 soonfei 的回复:

替换之后,你再输出一下s试试看看是多少。

应该是在s的基础上替换,s的值就变了吧。虽然,你又把这个值给了c,但是给c的值应该是你替换之后的s的值。

代码中弹出了,格式是reg.test()+reg.source+s;弹出的内容都注释出来了

作者: loveajin   发布时间: 2011-12-12

引用 2 楼 cj205 的回复:

g去掉呗。。

问题是第一次测试是true,第二次却是false……,求内幕

作者: loveajin   发布时间: 2011-12-12

引用 2 楼 cj205 的回复:
g去掉呗。。

是的。学习了。

作者: soonfei   发布时间: 2011-12-12

要么去掉g,要么 重新complie
JScript code

var reg=/^(.+?):(.+)$/i,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
//c=s.replace(reg,'$1');
alert(reg.test(s)+' '+reg.source+' '+s);//弹出false ^(.+?):(.+)$ a:a,为什么?????
//if(reg.test(s))cfg=s.replace(reg,'$2');

或者
var reg=/^(.+?):(.+)$/gi,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
//c=s.replace(reg,'$1');
reg.compile()
alert(reg.test(s)+' '+reg.source+' '+s);//弹出false ^(.+?):(.+)$ a:a,为什么?????
//if(reg.test(s))cfg=s.replace(reg,'$2');


作者: hookee   发布时间: 2011-12-12

引用 7 楼 hookee 的回复:

要么去掉g,要么 重新complie
JScript code

var reg=/^(.+?):(.+)$/i,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
//c=s.replace(reg,'$1');
alert(reg.test(s)+' '+reg.source+'……

高人能否指点一下,我只知道g是全文匹配,为什么要去掉才对?不去掉为什么要重新编译?replace用'$n'的方式修改了正则表达式什么地方?

作者: loveajin   发布时间: 2011-12-12

引用 8 楼 loveajin 的回复:
引用 7 楼 hookee 的回复:

要么去掉g,要么 重新complie
JScript code

var reg=/^(.+?):(.+)$/i,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
//c=s.replace(reg,'$1');
alert(reg……

应该和replace没有关系

全局匹配,先多第一个a开始,再从第二个a开始。第一个正好符合,为true.第二个不复合,为false.然后就这样循环。一直是true、false、true、false、true、false、true、false、……

高手们,我说的对不对?

作者: soonfei   发布时间: 2011-12-12

引用 8 楼 loveajin 的回复:

引用 7 楼 hookee 的回复:

要么去掉g,要么 重新complie
JScript code

var reg=/^(.+?):(.+)$/i,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
//c=s.replace(reg,'$1');
alert(re……
http://blog.csdn.net/cj205/article/details/6161968

作者: cj205   发布时间: 2011-12-12

引用 9 楼 soonfei 的回复:

引用 8 楼 loveajin 的回复:
引用 7 楼 hookee 的回复:

要么去掉g,要么 重新complie
JScript code

var reg=/^(.+?):(.+)$/i,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):(.+)$ a:a
//c=s.replac……
lastIndex,看我的博客吧 或者查手册

作者: cj205   发布时间: 2011-12-12

引用 11 楼 cj205 的回复:

要么去掉g,要么 重新complie
JScript code

var reg=/^(.+?):(.+)$/i,s='a:a',c,cfg;
alert(reg.test(s)+' '+reg.source+' '+s);//弹出true ^(.+?):……

谢谢老大,再请问是不是一共只有一个正则表达式全局对象,还是没定义一个正则表达式对象都会生成一个全局对象?

作者: loveajin   发布时间: 2011-12-12