javascript
JS编程建议——42:用好正则表达式静态值
建議42:用好正則表達式靜態值
正則表達式的靜態屬性比較特殊,有兩個名字:長名(全稱)和短名(簡稱,以美元符號開頭表示),詳細說明見表2.1。
表2.1 RegExp的靜態屬性
長名 短名 說明
input $_ 最后用于匹配的字符串,即傳遞給exec()或test()方法的字符串
lastMatch $& 最后匹配的字符
lastParen $+ 最后匹配的分組
leftContext $` 在上次匹配之前的子字符串
multiline $* 用于指定是否所有表達式都使用多行模式的布爾值
rightContext $' 在上次匹配之后的子字符串
在下面的這個示例中借助正則表達式的靜態屬性,匹配字符串“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,not Javascript”。
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 = "anbnc";
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屬性,考慮到瀏覽器的兼容性,不建議讀者使用這種動態方式設置正則表達式的多行匹配模式。
總結
以上是生活随笔為你收集整理的JS编程建议——42:用好正则表达式静态值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【 OJ 】亲和数
- 下一篇: Windows 8 应用开发 - 应用栏