JS中正則表達式
阿新 • • 發佈:2019-01-26
d+ 換行 font 替換 import p s 比較 模式匹配 str2
正則表達式用於對字符串模式匹配及檢索替換,是對字符串執行模式匹配的強大工具。簡單來說正則表達式就是處理字符串的,我們可以用它來處理一些復雜的字符串。
創建方式
var reg = new RegExp(pattern,modifiers); //構造函數創建方式,pattern 和 modifiers 均為字符串, var reg = /pattern/modifiers; // 字面量創建方式
pattern(模式):描述了表達式的模式
modifiers(修飾符) :用於指定不區分大小寫、全局匹配和多行匹配(i、g、m),當沒有時默認為區分大小寫只匹配第一個
字面量創建方式和構造函數創建方式的區別
1、字面量創建方式不能進行字符串拼接,實例創建方式可以
var regParam = ‘cm‘; var reg1 = new RegExp(regParam+‘1‘); var reg2 = /regParam/; console.log(reg1); // /cm1/ console.log(reg2); // /regParam/
2、字面量創建方式特殊含義的字符不需要轉義,實例創建方式需要轉義
var reg1 = new RegExp(‘d‘); // /d/ var reg2 = new RegExp(‘\\d‘) // /\d/ var reg3 = /\d/; ///\d/
修飾符
i:不區分大小寫
var str = "Visit RUnoob"; var patt1 = /runoob/; var patt2 = /runoob/i; console.log(patt1.test(str)) //false console.log(patt2.test(str)) //true
g:全局匹配,(即查找所有匹配而非在找到第一個匹配後停止)
var str="Is this all there is?"; var patt1=/is/g; console.log( str.match(patt1) ); // ["is", "is"]
m:執行多行匹配。多行匹配在需要匹配的字符串裏有換行符時凸顯出它的意義。如果沒有用多行匹配,那麽不管多少換行符,該字符串就只視為一行,只有一對頭和尾。如果使用了多行匹配,那麽每一行就都有一對頭和尾,使用 ^ 和 $ 進行匹配時結果就不一樣。
var str="This an \n good"; var reg=/an$/; var reg2=/an$/m; console.log( reg.test(str) ); //false console.log( reg2.test(str) ); //true var str2="This an \n good an"; var reg3 = /an$/mg; console.log( str2.match(reg3) ); // ["an", "an"]
元字符: http://www.runoob.com/jsref/jsref-obj-regexp.html
\d : 0-9之間的任意一個數字 \d只占一個位置 \w : 數字,字母 ,下劃線 0-9 a-z A-Z _ \s : 空格或者空白等 \D : 除了\d \W : 除了\w \S : 除了\s . : 除了\n之外的任意一個字符 \ : 轉義字符 | : 或者 () : 分組 \n : 匹配換行符 \b : 匹配邊界 字符串的開頭和結尾 空格的兩邊都是邊界 => 不占用字符串位數 ^ : 限定開始位置 => 本身不占位置 $ : 限定結束位置 => 本身不占位置 [a-z] : 任意字母 []中的表示任意一個都可以 [^a-z] : 非字母 []中^代表除了 [abc] : abc三個字母中的任何一個 [^abc]除了這三個字母中的任何一個字符
代表次數的量詞元字符
* : 0到多個 + : 1到多個 ? : 0次或1次 可有可無 {n} : 正好n次; {n,} : n到多次 {n,m} : n次到m次
正則表達式對象(RegExp)的方法
exec:返回一個數組,其中存放匹配的結果。如果未找到匹配,則返回值為 null。
reg.exec() 方法比較復雜,全局匹配和不全局匹配結果不一樣,當用到分組時結果又不一樣。
var str = ‘abc123cba456aaa789‘; var reg = /\d+/; console.log( reg.exec(str) ) //["123", index: 3, input: "abc123cba456aaa789"]; console.log(reg.lastIndex) //0 // [ "123",index:3,input:"abc123cba456aaa789" ] 中, // "123" 表示我們捕獲到的字符串 // index:3 表示捕獲到的字符串的起始位置 // input 表示原有的字符串
當我們用exec進行捕獲時,如果正則沒有加 ‘g‘ 標識符,則exec捕獲的每次結果都是同一個,當正則中有 ‘g‘ 標識符時捕獲的結果就不一樣了,再來看剛剛的例子
var str = ‘abc123cba456aaa789‘; var reg = /\d+/g; //此時加了標識符g console.log(reg.lastIndex) // lastIndex : 0 console.log(reg.exec(str)) // ["123", index: 3, input: "abc123cba456aaa789"] console.log(reg.lastIndex) // lastIndex : 6 console.log(reg.exec(str)) // ["456", index: 9, input: "abc123cba456aaa789"] console.log(reg.lastIndex) // lastIndex : 12 console.log(reg.exec(str)) // ["789", index: 15, input: "abc123cba456aaa789"] console.log(reg.lastIndex) // lastIndex : 18 console.log(reg.exec(str)) // null console.log(reg.lastIndex) // lastIndex : 0 // 每次調用exec方法時, 捕獲到的字符串都不相同 // lastIndex: 這個屬性記錄的就是下一次捕獲從哪個索引開始,當未開始捕獲時,這個值為0。 // 如果當前次捕獲結果為null。 那麽lastIndex的值會被修改為0.下次從頭開始捕獲。 // 而且這個lastIndex屬性還支持人為賦值。
exec的捕獲還受分組()的影響
let str = ‘aaabbb‘; let reg = /(a+)(b+)/; let reg2 = /(a+)(?:b+)/; console.log( reg.exec(str) ); //["aaabbb", "aaa", "bbb", index: 0, input: "aaabbb", groups: undefined] console.log( reg2.exec(str) ); //["aaabbb", "aaa", index: 0, input: "aaabbb", groups: undefined] //exec執行匹配的時候, 會先返回整體匹配值, 再分別返回按照正則表達式中由括號擴起來的小分組進行匹配的值。?: 可以取消返回該分組的匹配值。
JS中正則表達式