var a = 'aabbccdd';
alert(a.replace(/(a.*)(?=c)/gi,'-')); // -cdd
alert(a.replace(/(a.*)?(?=c)/gi,'-')); // --cdd
alert(a.replace(/(a.*?)(?=c)/gi,'-')); // -ccdd
alert(a.replace(/(a.*?)?(?=c)/gi,'-')); // --c-cdd
求解释以上结果为什么是这样。
解决方案 »
- javascript 如何等到事件响应结束 才继续执行
- jQuery用AJAX读取文章的内容到CKEditor内遇到的问题
- 大家有用EXTJS框架开发的么
- 上传图片问题 当天结帖!速度
- IE JScript第3种内存泄漏方式的问题。如果没有人能回答我得上微软那里问了。
- 用javascript判断文件的大小和扩展名??在线等待!!
- Html实现 如何在子窗体中清除父窗体中指定控件. 如何根据某控件的值 实现提交的不同逻辑.
- 论坛终于开通了,提问关于vml问题
- 請教關於text框內部分數字變小而且變色的方法
- 你能来看看吗--一个关于文件上传的问题!!!
- 正则截取网页的一部分
- jquery-1.4.2.js引用后仍然无提示
第二个,我理解不能
第三个,应该是非贪婪模式匹配 a.*,并在第一个 c 字符前停止,应该是
第四个,彻底思维停止。
a-ccdd》》-ccdd
-ccdd》--ccdd
--ccdd》--c-cdd结果 --c-cdd
a-ccdd》》-ccdd
-ccdd》--ccdd
--ccdd》--c-cdd结果 --c-cdd
alert(a.replace(/(^a.*)?(?=c)/gi,'-')); // --cdd
alert(a.replace(/^(a.*)?(?=c)/gi,'-')); // -cdd
下边这个可以确认匹配了一次 ^aabbccdd => -cdd
上边那个还是不能理解。
// aabb-c-cdd
// ,
// 这个是匹配到两次(?=c),前边的(a.)是无效的?alert(a.replace(/(a.)(?=c)/gi,'-') + '\n' + (/(a.)(?=c)/gi).exec(a));
// aabbccdd
// null
// 那么,这个 a. 为什么就有效了?alert(a.replace(/(a.*)(?=c)/gi,'-') + '\n' + (/(a.*)(?=c)/gi).exec(a));
// -cdd
// aabbc,aabbcalert(a.replace(/(a.*)?(?=c)/gi,'-') + '\n' + (/(a.*)?(?=c)/gi).exec(a));
// --cdd
// aabbc,aabbc
// 现有不管中间有没有问号,exec得到的内容是一样的,为什么replace会不一样?alert(a.replace(/(a.*?)(?=c)/gi,'-') + '\n' + (/(a.*?)(?=c)/gi).exec(a));
// -ccdd
// aabb,aabbalert(a.replace(/(a.*?)?(?=c)/gi,'-') + '\n' + (/(a.*?)?(?=c)/gi).exec(a));
// --c-cdd
// aabb,aabb
第二个:符号“?”有2个语义,当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的,而用在其他地方,比如do(es)?其作用和{0,1}等价,可以匹配do和does,所以这个正则也不难理解了,该正则等价于/(a.*)(?=c)|(?=c)/gi,会匹配aabbc以及一个空匹配
第三个:你理解得也差不多吧。。
第四个:和第二个差不多,关键在于?是有2个语义的。。
console.log(a.replace(/(a.*)(?=c)/gi,'-')); // -cdd
console.log(a.replace(/(a.*)?(?=c)/gi,'-')); // --cdd
console.log(a.replace(/(a.*?)(?=c)/gi,'-')); // -ccdd
console.log(a.replace(/(a.*?)?(?=c)/gi,'-')); // --c-cdd
console.group("/(a.*)(?=c)/gi");
a.replace(/(a.*)(?=c)/gi, function(){
console.dir(arguments);
})
console.groupEnd();
console.group("/(a.*)?(?=c)/gi");
a.replace(/(a.*)?(?=c)/gi, function(){
console.dir(arguments);
})
console.groupEnd();
console.group("/(a.*?)(?=c)/gi");
a.replace(/(a.*?)(?=c)/gi, function(){
console.dir(arguments);
})
console.groupEnd();
console.group("/(a.*?)?(?=c)/gi");
a.replace(/(a.*?)?(?=c)/gi, function(){
console.dir(arguments);
})
console.groupEnd();