帮我看看下面这段JS是怎么回事

wdzr_826 2010-11-04 05:36:22
italicRegx = /<(i|em)>/g;
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));

结果是true,false,true,false,true,false.....
...全文
134 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengwangtianxia 2010-11-06
  • 打赏
  • 举报
回复
受教了。
friendly_ 2010-11-05
  • 打赏
  • 举报
回复
原因:用g作全局匹配时,test 方法和exec方法进行匹配时是从正则对象的lastIndex处开始匹配。匹配前,lastIndex为0,第一次匹配时italicRegx.test("<i>The Second</i>"),匹配成功,italicRegx的lastIndex是3,即下次匹配时从4个字符开始匹配;
第二次匹配时,italicRegx.test("<i>The Second</i>")从lastIndex为3的‘T’开始匹配由于没有匹配成功,匹配结束,lastIndex置为0,下次从0开始匹配。所以第三次为true,后面类推。
解决方法:
1、在每次匹配前,将italicRegx的lastIndex置0即可。
2、在匹配前,把italicRegx compile 下。
3、每次匹配时用 /<(i|em)>/g来匹配,因为/<(i|em)>/g将每次都产生一个新的RegExp对象,其lastIndex为初始值0。
4、没必要用 g的地方,去掉。
wdzr_826 2010-11-05
  • 打赏
  • 举报
回复
但为什么会出现这个结果呢,有什么原因呢?
mark620 2010-11-05
  • 打赏
  • 举报
回复
转义字符吧
hch126163 2010-11-04
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 theforever 的回复:]

比如下面的使用,效果是一样的.
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i>".replace(/<(i|em)……
[/Quote]

学习了
  • 打赏
  • 举报
回复
我在上面说的"replace"的效果是一样的,是指都能正确完成.但其意义当然也是不同的.对于同样的多个标签的情况,比如下面的两种情况,结果是不同的.但其本身都是"正确完成"的,在预期之内,而不是象楼主那样觉得不可思议.
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/,""));
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/,""));
  • 打赏
  • 举报
回复
比如下面的使用,效果是一样的.
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i><i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i>".replace(/<(i|em)>/g,""));
alert("<i>The Second</i>".replace(/<(i|em)>/g,""));
但如果是test,则结果就可能不同.但test的目的,只是为了知道"有没有",而不是"有多少",所以就不应加/g这个flag了.
  • 打赏
  • 举报
回复
/g主要是用于match,replace,才有意义. 对于test来说,反而没必要使用.
pxynet 2010-11-04
  • 打赏
  • 举报
回复
italicRegx = /<(i|em)>/;
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
alert(italicRegx.test("<i>The Second</i>"));
这样就ok
hoojo 2010-11-04
  • 打赏
  • 举报
回复
"/"转义下看看

87,917

社区成员

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

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