javascript 正则表达式 全局修饰符
在javascript中定义一个正则表达式可以有如下形式:
直接量语法 var re = /pattern/attributes //注意后面不能有分号 创建 RegExp 对象的语法 var re = new RegExp(pattern, attributes);
参数 pattern 是一个字符串,指定了正则表达式的模式或其他正则表达式。
参数 attributes 是一个可选的字符串,包含属性 “g”、”i” 和 “m”,分别用于指定全局匹配、区分大小写的匹配和多行匹配。ECMAScript 标准化之前,不支持 m 属性。如果 pattern 是正则表达式,而不是字符串,则必须省略该参数。
如果用错了attributes中的g修饰符,可能会导致意想不到的结果。例如如下例子中。
var str = "abc123"; var re = /a.c/g var result1 = re.test(str); var result2 = re.test(str); var result3 = re.test(str);
可能第一眼看上去result1、result2、result3都为true吧,但是执行一下,得到的结果有些让人费解,result2为false。即使在var result2 = re.test(str)前对str从新赋值为str = “abctest”,得到结果还是false。为什么会这样呢?其实造成这个结果的原因就是在正则表达式中用全局匹配修饰符(/g),如果去掉/g,即re=/a.c/得到的结果就都为true。现在知道问题出在什么地方,但更深层的原因是什么呢?查看文档,发现RegExp对象有一个lastIndex的属性,如果使用了全局修饰符,那么执行test方法后,lastIndex就会记录匹配的字符串在原始字符串中最后一位的索引加一,例如执行了var result1 = re.test(str)后lastIndex为3,如果没有发现匹配lastIndex置为0。当下次再执行时,对给定的字符串匹配不是从开头位置,而是要依据lastIndex提供的位置,由于这个原因,所以导致上例中result2的值为false。另外也能通过程序重置lastIndex值。不知道这能不能算是javascript引擎的一个Bug。
最后总结一下正则表达式相关的一些操作,RegExp对象本身的方法有exec和test,字符串对象能使用正则的方法有search、match、replace和split。其中真正能用到全局修饰符的只有match和replace,所以在考虑使用正则表达式的时候不要滥用/g。