正則表達式的靜態屬性比較特殊,有兩個名字:長名(全稱)和短名(簡稱,以美元符號開頭表示),詳細說明見表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屬性,考慮到瀏覽器的兼容性,不建議讀者使用這種動態方式設置正則表達式的多行匹配模式。