讀古今文學網 > 編寫高質量代碼:改善JavaScript程序的188個建議 > 建議42:用好正則表達式靜態值 >

建議42:用好正則表達式靜態值

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