您好,登錄后才能下訂單哦!
JavaScript高級程序設計(第三版)筆記-第五章-RegExp類型
定義正則表達式有兩種方式
1、用字面量形式定義正則表達式:
ver expression = /patterns/flags;
patterns:可以是任何簡單或者復雜的正則表達式
flags:
g:表示全局
i:表示不區分大小寫
m:表示多行模式,在到達一行的末尾時還會繼續查找下一行
var patterns1 = /at/g;//匹配字符中所有“at”的實例var patterns2 = /[bc]at/i;//匹配所有的"bat"或"cat",不區分大小寫var patterns3 = /.at/gi;//匹配所有的以"at"結尾的三個字符的組合,不區分大小寫
模式中使用的所有元字符都必須轉義,正則表達式中的元字符包括:( [ { \ ^ $ | ) ? * + . ] }
var patterns4 = /\[bc\]at/i;//匹配第一個"[bc]at",不區分大小寫
2、用RegExp構造函數定義正則表達式,他接受兩個參數(patterns,flags)
var patterns2 = new RegExp("[bc]at","i");//與var patterns2 = /[bc]at/i;相同
同樣使用RegExp同樣也要對元字符進行轉義而且是雙重轉義
vqr pattterns4 = new RegExp("\\[bc\\]at","i");與var patterns4 = /\[bc\]at/i;相同
這兩種方法創建的正則表達式不一樣。正則表達式字面量會始終共享一個RegExp實例,而使用構造函數創建的每一個新RegExp實例都是一個新實例
var re = null, i; for(i=0;i<10;i++){//只為/cat/創建了一個RegExp實例,第一次調用成功,第二是失敗,因為當第二次調用時是從索引值為3的字符開始的,所以找不到他,當第三次調用時又會從開頭開始。 re = /cat/g; re.test("catgghi"); } for(i=0;i<10;i++){//用RegExp構造函數在每次循環中都會創建正則表達式,所以每次調用test()都會返回true re = new RegExp("cat","g"); re.test("catgghi"); }
RegExp實例屬性
global:是否設置了g標志
ignoreCase:是否設置了i標志
multiline:是否設置了m標志
lastIndex:表示開始搜索下一個匹配項的字符位置,從0算起
source:正則表達式的字符串表示
var patterns2 = /\[bc\]at/i; alert(patterns2.global); //falsealert(patterns2.source); //"\[bc\]at"
RegExp實例方法
RegExp對象的主要方法是exec(),專門為捕獲組設計的,接受一個參數,返回包含匹配項信息的數組,相對于Array的實例,多了兩個屬性index和input,在數組中,第一項是匹配的字符串,其他項是與模式中的捕獲組匹配的字符串。
input:表示應用正則表達式的字符串
index:表示匹配項在字符串中的位置
var text = "mom and dad and baby";var pattern = /mom (and dad (and baby)?)?/gi;var matches = pattern.exec(text); alert(matches.index); //0;alert(matches.input); //"mom and dad and baby"alert(matches[0]); //"mom and dad and baby"alert(matches[1]); //"and dad and baby"alert(matches[2]); //"and baby"
對于exec()方法,設置了全局標志(g),每次也只會返回一個匹配項。不設置全局標志的情況下,在同一個字符串上調用它是將始終返回第一個匹配項信息,設置了(g),每次調用它時都會在字符串中繼續查找。
var text = "cat, bat, sat, fat";var pattern1 = /.at/;var matches = pattern1.exex(text); alert(matches.index); //0alert(matches[0]); //catalert(pattern1.lastIndex); //0 matches = pattern1.exex(text); alert(matches.index); //0alert(matches[0]); //catalert(pattern1.lastIndex); //0var pattern2 = /.at/g;var matches = pattern2.exex(text); alert(matches.index); //0alert(matches[0]); //catalert(pattern1.lastIndex); //3matches = pattern1.exex(text); alert(matches.index); //5alert(matches[0]); //batalert(pattern1.lastIndex); //8
正則表達式的第二種方法是test(),接受一個參數。在模式與該參數匹配的時返回ture,否則返回false。
RegExp構造函數屬性
長屬性名 短屬性名 說明
input $_ 最近一次匹配的字符串
lastMatch $& 最近一次的匹配項
lastParen $+ 最近一次匹配的捕獲組
leftContext $` input字符串中lastMatch之前的文本
multiline $* 布爾值,表示是否所有表達式都使用多行模式。
rightContext $' input字符串中lastMatch之后的文本
var text = "this has been a short summer";var pattern = /(.)hort/g;if(pattern.test(text)){ alert(RegExp.input);//(RegExp.$_) //this has been a short summer alert(RegExp.leftContext);//(RegExp["$`"]) //this has been a }
注意:由于某些短屬性名大都不是有效的ECMAScript標識符,所以要通過方括號語法來訪問他們。
還有9個用于存儲捕獲組的構造函數屬性,RegExp.$1存儲第一個捕獲組,以此類推。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。