正则表达式字面量在ECMAScript5中的变化

 更新时间:2012年03月21日 16:43:38   作者:  
也就是说在ECMAScript3规范中,用正则表达式创建的RegExp对象会共享同一个实例,而在ECMAScript5中则是两个独立的实例
在《JavaScript语言精粹》的第72页有这样一段:

用正则表达式字面量创建的RegExp对象来共享同一个单实例:
复制代码 代码如下:

function make_a_matcher( ) {
return /a/gi;
}
var x = make_a_matcher( );
var y = make_a_matcher( );

// 注意:x 和 y 是同一个对象!

x.lastIndex = 10;

document.writeln(y.lastIndex); // 10当你在浏览器中运行这段代码时,你会发现IE6-IE9、FireFox4、Chrome10、Safari5输出都是0,Firefox 3.6.16输出是10,原因可以在ECMAScript5规范第24页和第247页找到:


A regular expression literal is an input element that is converted to a RegExp object (see 15.10) each time the literal is evaluated. Two regular expression literals in a program evaluate to regular expression objects that never compare as === to each other even if the two literals' contents are identical. A RegExp object may also be created at runtime by new RegExp (see 15.10.4) or calling the RegExp constructor as a function (15.10.3).

7.8.5: Regular expression literals now return a unique object each time the literal is evaluated. This change is detectable by any programs that test the object identity of such literal values or that are sensitive to the shared side effects.

也就是说在ECMAScript3规范中,用正则表达式创建的RegExp对象会共享同一个实例,而在ECMAScript5中则是两个独立的实例。《JavaScript语言精粹》出版时ECMAScript5还没有发布,在这个问题上书和ECMAScript3标准保持了一致。FireFox3.6遵循了ECMAScript3标准,所以结果与书中一致,而最新的Firefox4、Chrome和Safari5都遵循ECMAScript5标准,至于IE6-IE8都没有很好的遵循ECMAScript3标准,不过在这个问题上反而处理对了。很明显ECMAScript5的规范更符合开发者的期望,那就是相同的正则表达式字面量创建独立的RegExp对象会有不同的lastIndex,才方便分别处理。

在ECMAScript5规范的第247页还有两条来说明ECMAScript5和ECMAScript3在正则表达式字面量上的改变:

7.8.5: Edition 5 requires early reporting of any possible RegExp constructor errors that would be produced when converting a RegularExpressionLiteral to a RegExp object. Prior to Edition 5 implementations were permitted to defer the reporting of such errors until the actual execution time creation of the object.
7.8.5: In Edition 5 unescaped “/” characters may appear as a CharacterClass in a regular expression literal. In Edition 3 such a character would have been interpreted as the final character of the literal.

第1个是在ECMAScript5中正则表达式字面量转化为RegExp对象时,任何RegExp构造器的错误都会尽早报告,而在之前的规范中是只有对象创建真正执行时才会报错。

第2个是说在ECMAScript5的正则表达式字面量中,未转义的正斜杠“/”可以直接用在正则表达式字符类中。而在ECMAScript3中它只能作为正则表达式字面量的开始和结束字符。从IE6-IE9、Firefox3.6-Firefox4.0、Chrome和Safari都可以直接把未转义的正斜杠“/”用在正则表达式字符类中。如:
复制代码 代码如下:

var my_regexp = /([8/5+4]*).{3}/g;
var str = '8/5+4 is what!';

var result = my_regexp.exec(str); // the same in IE6-9,FF3.6-4.0,Chrome,Safari

for(var i = 0,n = result.length; i < n; ++i){
document.writeln(result[i]);
}
result[0] = 8/5+4 is
result[1] = 8/5+4

在《JavaScript语言精粹》第76页也指明在正则表达式的字符类中使用正斜杠“/”需要转义,也是基于ECMAScript3规范。由于正则表达式中需要转义的特殊字符比较多,当心存疑虑时对任何特殊字符都可以使用反斜杠“\”来使其字面化确保安全,不过这个规则不适宜字母和数字。

正则表达式字面量从ECMAScript3到ECMAScript5的改变也蛮符合HTML5设计原理中提到的2条。一条是“一旦遇到冲突,最终用户优先,其次是作者,其次是实现者,其次标准制定者,最后才是理论上的完满”,另一条是“支持已有内容”。

最后推荐一下XRegExp,它是一个非常优秀的正则表达式JavaScript库,兼容多个主流浏览器、ECMAScript3和ECMAScript5。

相关文章

  • 正则表达式匹配${key}并在Java中使用的详细方法

    正则表达式匹配${key}并在Java中使用的详细方法

    这篇文章主要介绍了正则表达式匹配${key}并在Java中使用的详细方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-03-03
  • Java正则相关的Pattern和Matcher类及遇到的坑

    Java正则相关的Pattern和Matcher类及遇到的坑

    这篇文章主要介绍了Java正则相关的Pattern和Matcher类及遇到的坑,本文给大家提到了Matcher 里面的三个方法,本文通过实例代码给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2019-09-09
  • 一篇文章搞懂JavaScript正则表达式之方法

    一篇文章搞懂JavaScript正则表达式之方法

    通过本文带领大家学习JavaScript中都有哪些操作正则的方法。本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友参考下吧
    2018-11-11
  • 用正则删除不包含某个字符串的行的代码

    用正则删除不包含某个字符串的行的代码

    这个需求发生在分析apache日志的时候。在日志中发现了一个比较可疑的ip,出现频率颇高,但每天的日志有几百万行,如何从中几百万行中找出需要的数据来进行分析呢?
    2009-09-09
  • 正则表达式中的反向预搜索实现

    正则表达式中的反向预搜索实现

    这几天在用正则表达式做一个小程序,需要替换内容中的某些特殊字符串。这些字符串的出现是有规律的,那就是在它左面总会特定的内容出现,右面却没有。于是自然就想到了反向预搜索。
    2009-09-09
  • 正则表达式Regular Expression (RegExp)详解

    正则表达式Regular Expression (RegExp)详解

    正则表达式,又称正规表示式、正规表示法、正规表达式、规则表达式、常规表示法(英语:Regular Expression,在代码中常简写为regex、regexp或RE
    2015-11-11
  • 常用正则表达式范例 方便表单验证

    常用正则表达式范例 方便表单验证

    常用正则表达式范例 方便表单验证,推荐大家收藏,以后在前台js验证中可以直接拿来用,强烈建议先理解后使用的原则。
    2009-09-09
  • js 匹配多个的Email地址的代码

    js 匹配多个的Email地址的代码

    js 匹配多个点的Email地址的代码 例如:xxx@xxx.xxx.xxx.xx
    2010-04-04
  • .NET 正则表达式使用高级技巧之替换类介绍

    .NET 正则表达式使用高级技巧之替换类介绍

    因为.net的基本正则语法和Perl5基本相同,所以基本语法你可以去下载一下M$的JS帮助文档,上面有详细的说明
    2012-04-04
  • Java 正则表达式详解

    Java 正则表达式详解

    如果你曾经用过Perl或任何其他内建正则表达式支持的语言,你一定知道用正则表达式处理文本和匹配模式是多么简单。
    2008-12-12

最新评论