正则表达式字面量在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。

时间: 2024-09-25 09:40:23

正则表达式字面量在ECMAScript5中的变化的相关文章

正则表达式字面量在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当你在浏览

《Java 7程序设计入门经典》一2.3 字面量

2.3 字面量 在Java中,字面量(literal)指人类可以阅读的固定值的表示.例如,数100是字面量.字面量也常常称为常量(constant).大多数字面量及其用法非常直观,前面的示例程序中已经以各种形式使用过它们.现在正式地解释它们. Java的字面量可以是任意基本数据类型.每种字面量的表示取决于类型.如前所述,字符常量由单引号包括.例如,'a'和'%'都是字符常量. 整数字面量是没有小数部分的数.例如,10和-10是整数字面量.浮点字面量有小数点,小数点后是小数部分.例如,11.123

JavaScript中字面量与函数的基本使用知识_基础知识

JavaScript 字面量 在编程语言中,一个字面量是一个常量,如 3.14. 数字(Number)字面量 可以是整数或者是小数,或者是科学计数(e). 3.14 1001 123e5 字符串(String)字面量 可以使用单引号或双引号 be written with double or single quotes: "John Doe" 'John Doe' 表达式字面量 用于计算: 5 + 6 5 * 10 数组(Array)字面量 定义一个数组: [40, 100, 1, 5

指针-Javascript中通过点操作符定义属性和字面量形式定义的区别

问题描述 Javascript中通过点操作符定义属性和字面量形式定义的区别 我已经有一种这样的困惑:第一种:function Person(){};Person.name = ""liang"";Person.age = 22 ;Person.sayName = function(){alert(this.name)}alert(Person.prototype.constructor == Person) ; // true在以上这个代码中,我创建了一个构造函数P

C++11中的小细节--字符串的原始字面量

原始字面量很容易理解,即不进行转义的完整字符串. 最近看了看Python,其中讲到了原始字符串. Both string and bytes literals may optionally be prefixed with a letter 'r' or 'R'; such strings are called raw strings and treat backslashes as literal characters. As a result, in string literals, '\U

PHP中使用json数据格式定义字面量对象的方法_php技巧

PHPer都知道PHP是不支持字面量了,至少目前版本都不支持.比如,在JS中可以这样定义object 复制代码 代码如下: var o = { 'name' : 'qttc' , 'url' : 'www.jb51.net' }; alert(o.name); Python中定义字典,也可以这样定义: 复制代码 代码如下: o = { 'name' : 'qttc' , 'url' : 'www.jb51.net' } print o['name'] 但在PHP中这么定义object: 复制代码

javascript中RegExp(),正则表达式直接量

JavaScript 中的正则表达式 : 先来简单介绍一下JavaScript中的正则表达式.ECMAScript v3 对 JavaScript 正则表达式进行了标准化.JavaScript 1.2 实现了ECMAScript v3 要求的正则表达式的子集,JavaScript 1.5实现了完整的标准.JavaScript的正则表达式完全以Perl程序设计语言的正则表达式工具为基础,所以如果您用过Perl语言,那我将要介绍的东西对您来讲绝对是小菜一碟.具体点来说就是: JavaScript 1

《Python参考手册(第4版•修订版)》——2.4 字符串字面量

2.4 字符串字面量 字符串字面量用于指定一个字符序列,其定义方法是把文本放入单引号(').双引号(")或三引号('''或""")中.这三种引号形式在语义上没有差别,但要求在字符串开始和结尾使用的引号类型必须相同.置于单引号和双引号中的字符串必须定义在一行上,而三引号的字符串可以分布在多行上,并且会将所有格式符号(即换行符.制表符.空格等)包含在内.像"hello" 'world'这样的相邻字符串(由空格.换行符或续行符隔开)将被连接起来,形成一

ECMAScript5中的对象存取器属性:getter和setter介绍_javascript技巧

显然这是一个无关IE(高级IE除外)的话题,尽管如此,有兴趣的同学还是一起来认识一下ECMAScript5标准中getter和setter的实现.在一个对象中,操作其中的属性或方法,通常运用最多的就是读(引用)和写了,譬如说o.get,这就是一个读的操作,而o.set = 1则是一个写的操作.事实上在除ie外最新主流浏览器的实现中,任何一个对象的键值都可以被getter和setter方法所取代,这被称之为"存取器属性". 毫无疑问,getter负责查询值,它不带任何参数,setter则