JavaScript核心參考教程--RegExp對象
博學,切問,近思--詹子知(https://blog.csdn.net/zhiqiangzhan)
正則表達式基礎
- 正則表達式的直接量字符
字符 匹配
字母數字字符 本身
/o NUL字符(/u0000)
/t 製位表(/u0009)
/n 換行符(/u000A)
/v 垂直製位表(/u000B)
/f 換頁符(/u000C)
/r 回車(/u000D)
/xnn 由十六進製數nn指定的拉丁字符,例如/u0A等價於/n
/uxxxx 由十六進製數xxxx指定的Unicode字符,例如/u0009等價於/t
/cX 控製字符X,例如,/cJ等價於/n - 正則表達式的字符類
字符 匹配
[...] 位於括號內的任意字符
[^...] 不在括號之中的任意字符
. 除換行符和其他Unicode行中止符之外的任意字符
/w 任何ASCII單字字符,等價於[a-zA-Z0-9_]
/W 任何ASCII非單字字符,等價於[^a-zA-Z0-9_]
/s 任何Unicode空白符[/f/n/r/t/v]
/S 任何Unicode非空白符,注意/w和/S的不同[^/f/n/r/t/v]
/d 任何ASCII數字,等價於[0-9]
/D 除了ASCII數字之外的任何字符,等價於[^0-9]
[/b] 退格直接量(特例) - 正則表達式的重複字符
字符 含義
{n,m} 匹配前一項至少n次,但不能超過m次
{n,} 匹配前一項n次,或更多次
{n} 匹配前一項恰好n次
? 匹配前一項0次或1次,也就是說這一項是可選的。等價於{0,1}
+ 匹配前一項1次或多次。等價於{1,}
* 匹配前一項0次或多次。等價於{0,}
在正則表達式中,括號具有幾種作用。一個作用是把單獨的項目組合成子表達式,以便可以象處理一個
獨立的單元那樣用|、*、+或?等來處理它們。括號的另一個作用是在完整的模式中定義子模式。當一
個正則表達式成功地和目標字符串相匹配時,可以從目標串中抽出和括號中的子模式相匹配的部分。 - 正則表達式的選擇、分組和引用字符
字符 含義
| 選擇。匹配的是該符號的左邊的子表達式或右邊的子表達式
(...) 組合。將幾個項目組合為一個單元,這個單元可由|、*、+或?等符號使用,
而且還可以記住和這個組合匹配的字符,以供此後的引用使用
(?:...) 隻組合。把項目組合到一個單元,但是不記憶與該組匹配的字符
/n 和第n個分組第一次匹配的字符相匹配,組是括號中的子表達式(可能是嵌套
的)。組號是從左到右計數的左括號數,以(?:形式分組的組不編碼。 - 正則表達式的錨元素
字符 含義
^ 匹配字符串的開頭,在多行檢索中,匹配一行的開頭
$ 匹配字符串的結尾,在多行檢索中,匹配一行的結尾
/b 匹配一個詞語的邊界。簡而言之,就是位於字符/w和/W之間的位置,或位於字符/w
和字符串的開頭和結尾的位置(但注意:[/b]匹配的是退格符)
/B 匹配非詞語邊界的字符
(?=p) 正前向聲明,要求接下來的字符都與模式p匹配,但是不包括匹配中的那些字符
(?!p) 反向前聲明,要求接下來的字符不與模式P匹配 - 正則表達式的標誌
字符 含義
i 執行大小寫不敏感匹配
g 執行一個全局匹配,簡而言之,即找到所有匹配,而不是找到第一個之後就停止
m 多行模式,^匹配一行的開頭和字符串的開頭,$匹配一行的結尾和字符串的結尾
JS中的RegExp對象
- 構造函數:
顯式構造函數,語法為:new RegExp("pattern"[,"flags"])。
隱式構造函數,語法為: /pattern/[flags]。 - 靜態屬性
index 是當前表達式模式首次匹配內容的開始位置,從0開始計數。其初始值為-1,每次成功匹配時,index屬性都會隨之改變。 input 返回當前所作用的字符串,可以簡寫為$_,初始值為空字符串""。 lastIndex 是當前表達式模式首次匹配內容中最後一個字符的下一個位置,從0開始計數,常被作為繼續搜索時的起始位置,初始值為-1,表示從起始位置開始搜索,每次成功匹配時,lastIndex屬性值都會隨之改變。 lastMatch 是當前表達式模式的最後一個匹配字符串,可以簡寫為$&。其初始值為空字符串""。在每次成功匹配時,lastMatch屬性值都會隨之改變。 lastParen 如果表達式模式中有括起來的子匹配,是當前表達式模式中最後的子匹配所匹配到的子字符串,可以簡寫為$+。其初始值為空字符串""。每次成功匹配時,lastParen屬性值都會隨之改變。 leftContext 是當前表達式模式最後一個匹配字符串左邊的所有內容,可以簡寫為$`(其中“'”為鍵盤上“Esc”下邊的反單引號)。初始值為空字符串""。每次成功匹配時,其屬性值都會隨之改變。 $1…$9 這些屬性是隻讀的。如果表達式模式中有括起來的子匹配,$1…$9屬性值分別是第1個到第9個子匹配所捕獲到的內容。 如果有超過9個以上的子匹配,$1…$9屬性分別對應最後的9個子匹配。在一個表達式模式中,可以指定任意多個帶括號的子匹配, 但RegExp對象隻能存儲最後的9個子匹配的結果。在RegExp實例對象的一些方法所返回的結果數組中,可以獲得所有圓括號內的子匹配結果。 - 實例屬性
global 返回創建RegExp對象實例時指定的global標誌(g)的狀態。如果創建RegExp對象實例時設置了g標誌,該屬性返回True,否則返回False,默認值為False。 ignoreCase 返回創建RegExp對象實例時指定的ignoreCase標誌(i)的狀態。如果創建RegExp對象實例時設置了i標誌,該屬性返回True,否則返回False,默認值為False。 multiLine 返回創建RegExp對象實例時指定的multiLine標誌(m)的狀態。如果創建RegExp對象實例時設置了m標誌,該屬性返回True,否則返回False,默認值為False。 source 返回創建RegExp對象實例時指定的表達式文本字符串。 - 實例方法
exec 語法格式為exec(str)。該方法使用創建RegExp對象實例時所指定的表達式模式對一個字符串進行搜索,並返回一個包含搜索結果的數組。
如果為正則表達式設置了全局標誌(g),可以通過多次調用exec和test方法在字符串中進行連續搜索,每次都是從RegExp對象的lastIndex屬性值指定的位置開始搜索字符串。
如果沒有設置全局標誌(g),則exec和test方法忽略RegExp對象的lastIndex屬性值,從字符串的起始位置開始搜索。 如果exec方法沒有找到匹配,返回值為null;如果找到匹配,則返回一個數組,並更新RegExp對象中有關靜態屬性以反映匹配情況。 返回數組中的元素0包含了完整的匹配結果,而元素1~n依次是表達式模式中定義的各個子匹配的結果。
test 語法格式為test(str)。該方法檢查一個字符串中是否存在創建RegExp對象實例時所指定的表達式模式,如果存在就返回True,否則返回False。 如果找到匹配項,則會更新RegExp對象中的有關靜態屬性,以反映匹配情況。 compile 語法格式為compile("pattern"[,"flags"])。該方法可以更換RegExp對象實例所使用的表達式模式,並將新的表達式模式編譯為內部格式,從而使以後的匹配過程執行更快。 - RegExp說明
默認情況下,正則表達式使用最長(也叫貪婪)匹配原則.當?緊隨其它限定符(*、+、?、{n}、{n,}、{n,m})之後時,匹配模式變成使用最短(也叫非貪婪)匹配原則.
分組組合符就是將正則表達式中的某一部分內容組合起來的符號,反向引用符則是用於匹配前麵的分組組合所捕獲到的內容標識符號
(1) (pattern)將圓括號中的pattern部分組合成一個可統一操作的組合項和子匹配,每個捕獲
的子匹配項按照它們在正則表達式模式中從左到右出現的順序存儲在緩衝區中.緩衝區從1開始編號,最多可存儲99個子匹配捕獲的內容.存儲在緩衝區中的子匹配捕獲的內容,可以在編程語言中被檢索,也可以在正則表達式中被反向引用.若要匹配字麵意義的括號字符"("和")",在正則表達式中要分別使用"/("和"/)".
(2) /num匹配編號為num的緩衝區所保存的內容,此處的num是一個標識特定緩衝區的一位或兩位十進製正整數,這種方式稱為子匹配的反向引用.反向引用最有用的應用之一就是能提供表示相同匹配項的能力,例如,要匹配連續的5個數字字符,可以使用/d{5}作為正則表達式文本,它可以匹配12345,但是,要匹配連續的5個相同的數字字符,如55555、11111等,需要使用(/d)/1{4}作為正則表達式文本,/1表示與前麵(/d)所捕獲的內容一樣,/1{4}則表示前麵的(/d)所捕獲的內容還連續出現4次.又例如,要匹配"Is is the cost of of gasoline going up up?"中所有連續重複的單詞部分,可以使用//b([a-z]+)/1/b/gi作為正則表達式文本.
(3) (?:pattern) 將圓括號中的pattern部分組合成一個可統一操作的組合項,但不把這部分內容當作子匹配捕獲,即pattern部分是一個非捕獲匹配,它匹配的內容不存儲在緩衝區中供以後使用.這對必須進行組合、但又不想讓組合的部分具有子匹配特點的情況很有用.
(4) (?=pattern)稱為正向"預測先行"匹配,在被搜索字符串的相應位置必須有pattern部分匹配的內容,但這部分匹配的內容不作為匹配結果處理,更不會被存儲在捕獲緩衝區中供以後使用.(?=pattern)必須位於一個正則表達式模式的最前或最後麵.
(5) (?!pattern)稱為反向"預測先行"匹配,在被搜索的字符串的相應位置不能有pattern部分匹配的內容,除此之外,功能與正向"預測先行"匹配一樣.
實例演示
- 簡單示例
1.測試RegExp屬性。 function demo(){ var str = "abcdd abcsszabcdddccabAbcddABCEE"; var regex = /a(bc)/gi; var t = null; while(t = regex.exec(str)){ var result = "index = " + t.index + ", match = " + t[0] + ", group = " + t[1]; result += "/n$1=" + RegExp.$1 + ", lastMatch=" + RegExp.lastMatch + ", leftContext=" + RegExp.leftContext; alert(result); } }
2.正則表達式擴展。//為RegExp實例擴展一個replaceAll方法,實現雖然簡單,但很實用。 RegExp.prototype.replaceAll = function(str, func){ var last = 0, index = 0, t = null, ret = ''; while(t = this.exec(str)){ index = RegExp.index; ret += str.substring(last, index); ret += func(t); last = RegExp.lastIndex; } ret += str.substring(last, str.length); return ret; } //本例演示了如何利用該擴展去除重複字符。 function testReplaceAll(){ var str = "aaaabbbbccccddddeeeefffff"; var regex = /(/w)/1+/gi; var result = regex.replaceAll(str, function(t){ return t[1] + ' ';; }); alert(result); }
- 注意事項
(?<=exp)零寬度正回顧後發斷言(不支持)
(?<!exp)零寬度負回顧後發斷言(不支持) - 參考資料
最後更新:2017-04-02 04:01:42