Javascript高階程式設計學習筆記(15)—— 引用型別(4)RegExp型別
JS中處理字串最常用的應該就是正則了
同樣正則(RegExp)型別也是JS中引用型別的一種
ECMAScript通過 RegExp型別 來支援正則表示式
建立正則
var expression = / pattern / flags;
在上面建立正則例項中 pattern 部分可以是任意簡單或複雜的正則表示式,每個正則表示式可以有一個或多個 flags 來標明正則的行為
使用建構函式建立
var expression = new RegExp("pattern","flags"); // 接收兩個字串引數
PS. 由於該建構函式的引數為字串,所以需要雙重轉義
比如:
/ \[bc\]at / 等效於 "\\[bc\\]at"
兩種建立方式的區別在於(ES3中存在該區別,ES5兩者沒有區別):
字面量(表示式)建立的正則會共享一個正則例項,而建構函式每次都會建立一個新的例項
對於上述差異我在使用IE11模擬IE5時並未體現出有此差異,這一點大家看看就好
正則支援以下3種標誌(ES5)
g:全域性模式即找到匹配項後仍會繼續向後查詢,直到掃描完整個字串
i :不區分大小寫模式、即在正則匹配時忽略正則的大小寫
m:多行模式,即一行文字匹配完成後繼續匹配下一行
元字元:
元字元就是指在正則中具有特殊功能的字元,如果希望正則匹配這些字元,那麼則需要對這些字元進行轉義
( [ { \ ^ $ | ) ? * + . ] }
RegExp的例項屬性
每個正則例項都有以下屬性:
global:是否為全域性匹配
ignoreCase:是否忽略大小寫
lastIndex:開始下一次搜尋的起始位置
multiline:是否多行匹配
source:正則表示式的字串表示,格式為字面量形式
以上屬性雖然詳細描述了正則狀態,但是實際用處並不大,因為在建立這些例項時我們已經顯式地聲明瞭這些資訊
RegExp的例項方法
exec()該方法主要為捕獲組設計,接收一個引數即要應用正則規則的字串
返回一個帶有index、input屬性的Array例項
index屬性表示匹配項在整個字串中的位置
input 屬性表示該方法傳入的引數字串也就是“輸入”
對於返回的Array例項第一項是與正則規則匹配的字串
其它項是正則捕獲組匹配的字串
沒有匹配項返回null
PS.對於全域性模式每次也只返回一個匹配項,重複呼叫會從上次停止的地方繼續,直到比對完整個字串;對非全域性模式的重複呼叫結果始終的匹配的第一個
test()該方法主要用於我們不關心匹配項是什麼只關心是否匹配的情況
接收一個引數即需要匹配的字串,返回true或false,一般用於條件判斷中
繼承方法:
關於RegExp繼承自Object 的方法
1. toLocaleString、toString 都會返回正則表示式的字面量
2.valueOf 返回正則本身
RegExp建構函式屬性
這些屬性的值會根據最近一次正則匹配的結果而有所變化
這些屬性都有兩種訪問方式,一種是長屬性,一種是短屬性
長屬性 短屬性 內容
input $_ 最近一次匹配的字串
lastMatch $& 最近一次的匹配項
lastParen $+ 最近一次的匹配的捕獲組
leftContext $` lastMatch之前的文字
multiline $* 是否所有表示式都是多行模式(該屬性已廢除)
rightContext $' lastMatch之後的文字
PS. 對於短屬性中無效的ECMA字元需要使用中括號來訪問 如 RegExp["$`"]
除此而外就算test方法只返回 Boolean 其他的相應屬性也會在上面的屬性獲取到
PS. $1~$9分別對應9個捕獲組
Js中正則的侷限性
JS中的正則雖然比較完備,但是仍缺少一些語言(Perl)所支援的高階正則表示式的特性
1.向後查詢
2.交集並集
3.原子組
4.命名捕獲組
5.s單行 x無間隔 模式
6.條件匹配
7.正則表示式註釋
以上就是JS中正則的部分,詳情見MDN
即便如此,JS中的正則物件還是能夠滿足我們平時絕大部分的匹配任務