这是不是Js的bug?

www_7di_net 2011-07-19 01:14:54
下边的代码执行之后得不到我预期的结果:
var aa = ',1,2,3,1,2,2,2,4,';
_val='2';
var re=eval('/,'+_val+',/gi');
alert(aa.replace(re,","));


预期的结果是:
,1,3,1,4,


而实际执行的结果是:
,1,3,1,2,4,


请问怎么改?
...全文
149 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
koo42636880 2011-07-19
  • 打赏
  • 举报
回复
这不是bug...楼主按照从前向后运行的次序理解就能明白...
var aa = ',1,2,3,1,2,2,2,4,';
而 var re=eval('/,'+_val+',/gi'); alert(re)是/,2,/gi
字符串中的匹配点有,1,2,3,1,2,2,2,4,
你把红色部分换为,号就是 ,1,3,1,2,4,
得到的这个 ,1,3,1,2,4, 中的,2,的","号是替换出来的,所以正则不会去再匹配!!!!

xs8577 2011-07-19
  • 打赏
  • 举报
回复
如果确定是全部以","分隔的话,可以试试把他当做一个单词来看待嘛
var re=eval('/\b'+_val+'\b/gi');
alert(aa.replace(re,""));
www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
感謝s1120624175

馬上結帖

最終結果是:


var aa = ',1,2,3,1,2,2,2,22,202,4,';
_val='2';
re=eval('/,'+_val+'(?=,)/gi');

alert(aa.replace(re,''));


www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 hengdd 的回复:]

不是Bug来的

var aa = ',1,2,3,1,2,2,2,4,';

你替换的是 ,2,

那么你应该将字符串这样看

',1 (,2,) 3,1 (,2,) 2 (,2,) 4,'
所以替换结果为,1,3,1,2,4,,没错
[/Quote]

恩,有道理,那如果我要把所有的 ,2, 都替換成一個逗號怎麼寫呢?
s1120624175 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sibang 的回复:]

,2,
2左右两侧的逗号是必须的,要不然不准确,有可能会匹配2开头的任何数字.
[/Quote]

eval('/,'+_val+'(?=,)/gi') 试过没有
www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
,2,
2左右两侧的逗号是必须的,要不然不准确,有可能会匹配2开头的任何数字.
荒牧 2011-07-19
  • 打赏
  • 举报
回复
不是Bug来的

var aa = ',1,2,3,1,2,2,2,4,';

你替换的是 ,2,

那么你应该将字符串这样看

',1 (,2,) 3,1 (,2,) 2 (,2,) 4,'
所以替换结果为,1,3,1,2,4,,没错
s1120624175 2011-07-19
  • 打赏
  • 举报
回复
eval('/,'+_val+'(?=,)/gi') 这样 右边必须是逗号 但不包含右边的逗号
www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
5楼 6楼:
感谢你的回复,你说的方法我全都测试过了,结果还是错误的.不知道你有没有测试过.
s1120624175 2011-07-19
  • 打赏
  • 举报
回复
不对不对不对。。。你写错了

应该这样 alert(aa.replace(eval('/,'+_val+'/gi'),""));

,2,2,
只会匹配一个“ ,2,” 留下一个“2”,
USERNAME_FB 2011-07-19
  • 打赏
  • 举报
回复
lz 看清楚你自己定义的re输出的结果是什么就知道实际结果为什么和预期结果不一致了。
你的re输出为:“/,2,/gi”
这样肯定会多出一个2的,因为第3个“2”前面没了“,”,所以不会replace掉。
www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 guowangsheng2011 的回复:]

JScript code
var aa = ',1,2,3,1,2,2,2,4,';
_val='2';
var re=eval('/,'+_val+'/gi');

aa = aa.replace(re,"")
alert(aa);

试试
[/Quote]
谢谢,我测试了,貌似可以,但实际不行
你去掉一个逗号是可以的,但是这样替换的结果就不准确了,例如20,21,26,219,等都被匹配了.
s1120624175 2011-07-19
  • 打赏
  • 举报
回复
或者

var re = new RegExp(eval('/,'+_val+',/gi'));
alert(aa.replace(re,","));

s1120624175 2011-07-19
  • 打赏
  • 举报
回复
alert(aa.replace(eval('/,'+_val+',/gi'),","));

这样就行
一品 2011-07-19
  • 打赏
  • 举报
回复
var aa = ',1,2,3,1,2,2,2,4,';
_val='2';
var re=eval('/,'+_val+'/gi');

aa = aa.replace(re,"")
alert(aa);

试试
xuexiaodong2009 2011-07-19
  • 打赏
  • 举报
回复
牛人啊,没研究过
www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
不是吧,竟然無人回答
www_7di_net 2011-07-19
  • 打赏
  • 举报
回复
这是比较扯淡的做法
_newval=_oldval.replace(re,",").replace(re,",").replace(re,",");

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧