`
yiminghe
  • 浏览: 1460381 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

正则表达式共享问题

阅读更多

票务监控 的一个应用:高亮原页面关注城市名,原来做法为对每条记录的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));
 

 

 

 

0
0
分享到:
评论

相关推荐

    6款正则表达式工具

    7. **导出和导入**:可以将正则表达式保存为文件或导入其他正则表达式,方便在项目间共享。 8. **调试工具**:通过分析匹配过程,帮助用户理解正则表达式的执行步骤,提高调试效率。 在实际应用中,正则表达式工具...

    正则表达式转换为NFA

    正则表达式是一种强大的文本处理工具,用于匹配和操作字符串模式。它们在编程语言中广泛使用,例如在C语言中,常用于数据验证、搜索、替换等任务。本项目涉及的是将正则表达式转换为非确定性有限状态自动机(NFA),...

    VC++支持中文的正则表达式函数库

    在IT行业中,正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找、替换和解析字符串。在C++编程环境下,虽然标准库没有内置的正则表达式支持,但开发人员经常通过第三方库来实现这一功能。...

    非常好的正则表达式验证工具

    - **协同工作**:可分享和保存正则表达式,方便团队成员共享和复用。 4. **正则表达式进阶技巧**: - **回溯**:了解正则引擎如何处理回溯,避免无限循环问题。 - **预查否定**:使用`(?!)`否定预查,匹配不包含...

    正则表达式匹配regex.rar

    正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,用于匹配、查找、替换或提取字符串中的模式。在编程、数据处理和文本编辑器中广泛应用,它通过一套特定的字符序列(元字符和量词)来定义要...

    PCRE 正则表达式 DLL 工程

    PCRE(Perl Compatible Regular Expressions)是一种强大的正则表达式库,它由Philip Hazel开发,并在GNU GPL许可下发布。PCRE库被广泛应用于各种编程语言和应用程序中,因为它提供了与Perl语言中正则表达式语法高度...

    UE使用技巧(宏、正则表达式)

    处理字符时,少不了UE(UltraEidt)的帮忙,只有在处理中才发现其功能之强悍。在此,共享个人积累,抛砖引玉,希望对大家有用。

    正则表达式的用法

    里面有很多正则表达式,然后也有案例 写如何使用正则表达式。 这个是自己整理的,这次把它共享给CSDN的各位朋友们。 新手不可错过哟。

    带有正则表达式校验的TextBox

    在.NET框架中,正则表达式(Regular Expression)是一种强大的文本处理工具,它能用于模式匹配、搜索、替换等操作。在本项目中,“带有正则表达式校验的TextBox”是一个自定义控件,它是对标准TextBox的扩展,增加了...

    正则表达式帮助文档.pdf

    正则表达式是处理文本数据的强大工具,通过对普通字符、转义字符、字符类别、自定义字符集和量词的学习,我们可以更灵活地处理文本匹配问题。希望本篇文章能帮助读者更好地理解和掌握正则表达式的使用技巧。

    ASP 正则表达式ASP 正则表达式

    根据给定的文件信息,可以看出这里讨论的主题与ASP正则表达式无关,而是涉及了Windows API函数在Visual Basic(VB)中的使用。然而,既然题目要求我们从标题和描述中提取有关“ASP 正则表达式”的知识点,我们将首先...

    JavaScript手册及正则表达式详解[收藏]

    正则表达式则是JavaScript中的一个重要工具,用于处理字符串的模式匹配和查找。在这个“JavaScript手册及正则表达式详解”中,我们将深入探讨这两个关键主题。 一、JavaScript基础 JavaScript是一种解释型、弱类型...

    水淼。正则表达式助手

    8. **导出与导入**:可以导出匹配结果或者正则表达式配置,方便在不同设备或项目间共享。 水淼·正则表达式助手通过简化正则表达式的使用,降低了数据采集和处理的门槛,使用户能够更加专注于实际业务逻辑,而非...

    易语言正则表达式测试工具源码

    6. 错误提示:如果输入的正则表达式有语法错误,源码会给出相应的错误提示,帮助用户快速定位问题。 通过研究这份源码,开发者不仅可以学习易语言的基础语法,还能深入了解正则表达式的应用和实现。同时,源码中的...

    正则表达式测试工具RegexBuddy

    RegexBuddy是一款强大的正则表达式测试工具,它专为程序员和高级用户设计,帮助他们在处理文本模式匹配和数据提取时提升效率。该工具提供了一种直观且友好的界面,使得构建、测试和理解复杂的正则表达式变得简单易行...

    正则表达式工具MatchTracer.rar

    《正则表达式工具MatchTracer深度解析》 在信息技术领域,正则表达式(Regular Expression,简称regex)是一种强大的文本处理工具,广泛应用于数据验证、搜索与替换、文本分析等多个场景。对于开发者来说,理解和...

    XML正则表达式工具

    5. **保存和分享**:将成功的正则表达式保存到XML文件,方便以后重用或与他人共享。 掌握XML正则表达式工具的使用,不仅可以提升数据处理能力,还能在处理XML数据时减少错误,提高工作效率。对于经常处理XML数据的...

    正则表达式工具.msi

    正则表达式工具.msi 正则表达式工具.msi 正则表达式工具.msi 正则表达式工具.msi

    张孝祥老师讲解什么是正则表达式

    在张孝祥老师的讲解中,他提到正则表达式本质上是一个模式,用于描述一组共享相同特征的字符串。例如,`astring`, `alongerstring`, `amuchlongerstring` 这三个字符串都以"a"开头并以"string"结尾。正则表达式能够...

Global site tag (gtag.js) - Google Analytics