票务监控
的一个应用:高亮原页面关注城市名,原来做法为对每条记录的innerhtml都进行
var reg=/郑州/g;
el.innerHTML=el.innerHTML.replace(reg,"....");
想优化一下,避免不必要的DOM操作,同时共享一个正则实例:
var reg=/郑州/g;
if(reg.test(el.innerHTML))
el.innerHTML=el.innerHTML.replace(reg,"....");
结果出现了意想不到的结果,抽象如下:
例子:
猜猜下面代码内容:
var reg=/a/g;
console.log(reg.test('a'));
//console.log(reg.lastIndex);
console.log(reg.test('a'));
//console.log(reg.lastIndex);
吃惊的话看看下面:
var reg=/a/g;
console.log(reg.test('a'));
//console.log(reg.lastIndex);
console.log(reg.test('ba'));
//console.log(reg.lastIndex);
还是要看规范:
15.10.6.3 RegExp.prototype.test(string)
The following steps are taken:
1. Let match be the result of evaluating the RegExp.prototype.exec (15.10.6.3) algorithm upon this
RegExp object using string as the argument.
2. If match is not null, then return true; else return false.
我一直忽略了原来 test 实际上是 :
(r.exec(s) != null)
那么知道exec 对待 g 正则表达式,会记录 lastIndex 到这个正则表达式上,这样子的话 第二个 test 则会从第一个 test 的 lastIndex 开始匹配,出现了上述的结果。
总结原因:
1.test 等于 调用exec
2.lastIndex 存在于正则表达式中,而不是 java 一样有一个 matcher 对象存放 index,或者像 perl 一样 lastIndex 实际上和字符串关联,而javascript 这样子lastIndex和正则表达式关联,test还是最好不要设 g。
3.不成熟的优化等于魔鬼,实际上我可以再单独设一个检测正则表示式即可:
var reg=/郑州/g;
var reg2=/郑州/;
if(reg2.test(el.innerHTML))
el.innerHTML=el.innerHTML.replace(reg,"....");
PS:共享带来的问题:
有时想为了一点内存,共享几个对象实例,而对于正则表达式则要特别小心,因为正则实例的一些状态比如lastIndex在不同的操作中(test,exec)常常会被影响的,例如:
var script_re = /x/g;
var m,x = "avbxz",loop = 1;
while (m = script_re.exec(x)) {
console.log(script_re.lastIndex + " : " + m[0]);
//重置lastIndex要死循环喽
//"y".replace(script_re, "");
//console.log("after replace : "+script_re.lastIndex );
//"y".match(script_re);
//console.log("after match : "+script_re.lastIndex );
loop++;
if (loop == 100) {
alert("die!");
break;
}
}
updated : 2010-12-10
用 match 取代 test
最好还是不要用 test 来进行判断 :
var reg=/d/g;
console.log(reg.test("dd"));
console.log(reg.test("dg"));
因为 test 在 //g 会导致lastIndex 记载在该正则表达式中影响后续操作,如果不在乎性能的话,可用 match 取代:
var reg=/d/g;
console.log("dd".match(reg));
console.log("dg".match(reg));
分享到:
相关推荐
正则表达式大全 摘要:收集一些常用的正则表达式。 正则表达式用于字符串处理,窗体验证等场合,实用高效,但用到时总是不太把握,以致往往要上网查一番。共享一些常用的表达式在这里,作备忘之用。
Jmeter-使用正则表达式提取器获取关联参数的使用方法,网络资源共享!
正则表达式帮助文档.pdf 正则表达式帮助文档.pdf 正则表达式帮助文档.pdf
因此,正则表达式字符串必须先编译为Pattern对象,然后再利用该Pattern对象创建对应的Matcher对象,执行匹配所涉及的状态保留在Matcher对象中,多个Matcher对象可共享同一个Pattern对象。 例如:典型的调用顺序 //将...
处理字符时,少不了UE(UltraEidt)的帮忙,只有在处理中才发现其功能之强悍。在此,共享个人积累,抛砖引玉,希望对大家有用。
里面有很多正则表达式,然后也有案例 写如何使用正则表达式。 这个是自己整理的,这次把它共享给CSDN的各位朋友们。 新手不可错过哟。
自己在做的一个项目,期间遇到好几个正则表达式,所以从各个网站和资源中汇编集合了这个《c、c++最常用的正则表达式集合》和大家共享。
我收集的正则表达式资料及验证工具,与大家共享!
即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...
即使有经验的用户也经常会遇到性能不佳、误报、漏报等让人挠头的错误,本书对于如何使用正则表达式来解决一些常见的问题给出了按部就班的解决方案,其中包括c#、Java、JavaScript、Perl、PHP、Python、Ruby和VB...
主要讲解正则表达式含义、如何使用,方便使用asp.net ajax和asp.net等用户验证控件内容,有点繁琐,但只要掌握其中常用的就行了,网上揭下的,供大家共享,内有验证软件。
正则表达式工具.msi 正则表达式工具.msi 正则表达式工具.msi 正则表达式工具.msi
C#编写正则表达式,用来提取html网页中的所有的Email地址,共享示例一枚!欢迎下载学习!欢迎访问:http://blog.csdn.net/zxcvbnm32123?viewmode=list
JS正则表达式学习共享.pdf
这在创建正则表达式时特别有用,这些正则表达式将用于需要使用特定编程语言的多个版本的共享库。 它还提供了一个广泛的公共正则表达式库,您可以在各种情况下使用它。 此外,它还提供了各种下拉选项来帮助您选择...
avaScript正则表达式帮助文档这是我从网上收集的,现在放到本站给大家共享,希望能对大家学习正则表达式有一定的作用。
正则表达式学习,讲解详细;好文需共享! 正则表达式学习,讲解详细;好文需共享! 正则表达式学习,讲解详细;好文需共享!
正则表达式入门到精通的学习手册,大家相互共享
正则表达式调试工具,不错的哦,也是网上找的,共享一下!
在使用中经过过验证的正则表达式,小弟认真总结了一下,拿出来与大家共享吧。