正则表达式的静态属性比较特殊,有两个名字:长名(全称)和短名(简称,以美元符号开头表示),详细说明见表2.1。
在下面的这个示例中借助正则表达式的静态属性,匹配字符串“Javascript”,不区分大小写:
var s="Javascript,not Javascript";
var r=/(Java)Script/gi;
var a=r.exec(s);
alert(RegExp.input);//"Javascript,not Javascript"
alert(RegExp.leftContext);//空字符串,因为在第一次匹配操作时,左侧没有内容
alert(RegExp.rightContext);//",not Javascript"
alert(RegExp.lastMatch);//"Javascript"
alert(RegExp.lastParen);//"Java"
上面示例演示了正则表达式的几个静态属性的用法。
❑input属性实际上存储的是被执行匹配的字符串,即整个字符串“Javascript,notJavascript”。
❑leftContext属性存储的是执行第一次匹配之前的子字符串,这里为空,因为在第一次匹配时文本“Javascript”左侧为空,而rightContext属性存储的是执行第一次匹配之后的子字符串,即为“,not Javascript”。
❑lastMatch属性包含的是第一次匹配的子字符串,即为“Javascript”。
❑lastParen属性包含的是第一次匹配的分组,即为“Java”。如果模式中包含多个分组,则会显示最后一个分组所匹配的字符。例如:
var r=/(Java)(Script)/gi;
var a=r.exec(s);//执行匹配操作
alert(RegExp.lastParen);//返回"Script",而不再是"Java"
也可以使用短名来读取这些属性所包含的值,考虑到这些短名不符合JavaScript语法规范,因此必须使用中括号运算符来进行读取操作。不过对于$_属性来说,由于它符合JavaScript标识符语法规范,因此可以直接使用。例如,针对上面示例也可以这样设计:
var s="Javascript,not Javascript";
var r=/(Java)(Script)/gi;
var a=r.exec(s);
alert(RegExp.$_);//"Javascript,not Javascript"
alert(RegExp["$"]);//空字符串
alert(RegExp["$'"]);//",not Javascript"
alert(RegExp["$&"]);//"Javascript"
alert(RegExp["$+"]);//"Java"
这些属性的值都是动态的,每次执行exec或test方法时,所有属性值都会被重新设置。当在下面示例中执行第一次匹配和第二次匹配时,这些静态属性值都会实时动态更新。
var s="Javascript,not Javascript";
var r=/Scrip(t)/gi;//第一次定义的匹配模式
var a=r.exec(s);//执行第一次匹配
alert(RegExp.$_);//"Javascript,not Javascript"
alert(RegExp["$"]);//"Java"
alert(RegExp["$'"]);//",not Javascript"
alert(RegExp["$&"]);//"Script"
alert(RegExp["$+"]);//"t"
var r=/Jav(a)/gi;//第二次定义的匹配模式
var a=r.exec(s);//执行第二次匹配
alert(RegExp.$_);//"Javascript,not Javascript"
alert(RegExp["$"]);//空字符串
alert(RegExp["$'"]);//"Script,not Javascript"
alert(RegExp["$&"]);//"Java"
alert(RegExp["$+"]);//"a"
通过上面的示例可以看出,RegExp对象的静态属性是公共的,对于所有正则表达式来说是可以共享的,因此这些静态属性的值也是实时变化的。
multiline属性与上面几个属性不同,它不会根据每次执行的操作进行实时更新,并且还可以控制所有正则表达式的m标志项。例如:
var s="a/nb/nc";
var r=//w+$/g;//定义匹配模式
var a=s.match(r);//执行默认匹配,返回数组["c"]
RegExp.multiline=true;//动态设置模式为多行匹配
var a=s.match(r);//["a","b","c"]
提示:IE和Opera浏览器不支持RegExp.multiline属性,考虑到浏览器的兼容性,不建议读者使用这种动态方式设置正则表达式的多行匹配模式。