js筆記(正則表示式續)
//\b 單詞邊界 //\B 非單詞邊界 例5: var reg = /\bcde\B/g; str = "abc cdefgh"; //str.match(reg) 返回結果為"cde"
//\t匹配的不是視覺上的縮排,而是內容上的\t 同理:\n 也是 例6: var reg = /\t/g; str = "abc cdefgh"; //str.match(reg) 返回結果為null不是字串型別 例27: var reg = /\tc/g; str = "abc\tcdefgh"; //str.match(reg) 返回結果為[" c"] 例8: var reg = /\nc/g; str = "abc\ncdefgh"; //str.match(reg) 返回結果為(自行試試)
//unicode編碼 原來的ASCII7位8位指的是二進位制數,而unicode 第一種表達形式:\u0000 這裡一位指的是16進位制的(包含漢字) 第二種表達形式: 第一層:\u010000 - \u01ffff 第二層:\u020000 - \u02ffff ..... 第十六層:\u100000 - \u10ffff 例1: var reg = /\u5c0f\u4ed9\u5973/g; str = "小仙女"; //str.match(reg) 返回結果為["小仙女"]; 例2: var reg = /[\u4e00-\u5c10]/g; str = "小仙女"; //str.match(reg) 返回結果為["小","仙","女"]; 例3:查詢全部字元,好多種方法,這裡只是列舉出了兩個 var reg = /[\s\S]/g; var reg = /[\d\D]/g;
// . === [^\r\n]; var reg = /./g; str = "小仙女 一枚"; //str.match(reg) 返回結果為["小","仙","女"," ","一","枚"];
5.量詞 // n+ n可以出現{1,}一次到多次,可以匹配到 1到任何個n // n* n可以出現{0,}0次到多次,可以匹配到 0到任何個n 例1:貪婪匹配原則,能多不少 var reg = /\w+/g; var str = "abc"; //str.match(reg) 返回結果為["abc"]; 例2: var reg = /\w*/g; var str = "abc"; //str.match(reg) 返回結果為["abc", ""];,這個因為剛開始匹配\w匹配到三個字元,*就為3,後來\w重頭開始為0,就認為這個//中的部分為空,就又匹配到了一個空串。 例3: var reg = /\d*/g; var str = "abc"; //str.match(reg) 返回結果為["", "", "", ""];,游標剛開始在a前面,然後就匹配一個空的,然後a不是,游標跑到了a後面又匹配到了一個,以此類推,匹配到了4個空串,也就是在這題中,游標有幾個位置,就幾個空
// n? n可以出現{0,1}0或者1次,可以匹配到 0到1個n 例1: var reg = /\w?/g; var str = "abc"; //str.match(reg) 返回結果為["", "", "", ""];
// n{X} {x}意思就是匹配x個 例1: var reg = /\w{2}/g; var str = "abc"; //str.match(reg) 返回結果為["ab"];
// n{x,y} {x,y}意思就是匹配x到y個 例1:貪婪匹配原則 var reg = /\w{2,3}/g; var str = "abc"; //str.match(reg) 返回結果為["abc"];
// n{x, } {x,}意思就是匹配x到無窮個 例1: var reg = /\w{2,}/g; var str = "abcdef"; //str.match(reg) 返回結果為["abcdef"];
//n$ 匹配任何結尾為 n 的字串。 //^n 匹配任何開頭為 n 的字串。 例1: var reg = /^abc/g; var str = "abcdef"; //str.match(reg) 返回結果為["abc"]; 例2: var reg = /f$/g; var str = "abcdef"; //str.match(reg) 返回結果為["f"];因為就一個以f結尾的字串,返回一個f 例3:以當前abc開頭而且1這個abc結尾,必須是一人,所以達到了限定字串的作用 var reg = /^abc$/g; var str = "abcabc"; //str.match(reg) 返回結果為null
//?=n 匹配任何其後緊接指定字串 n 的字串。 //正向預查 正向斷言 例1: var str = "abcaaaaab" var reg = /a(?=b)/g; /*這代表a後面跟著b但是b不參與選擇,b只參與修飾*/ //str.match(reg) 返回["a", "a"]
//?!n 匹配任何其後沒有緊接指定字串 n 的字串。 例1: var str = "abcaaaaab" var reg = /a(?!b)/g; /*這代表a後面跟著b但是b不參與選擇,b只參與修飾*/ //str.match(reg) 返回["a", "a", "a", "a"]
6.RegExp物件屬性 reg是個物件,物件上有很多方法和屬性 reg.global:檢驗是否含有g reg.ignoreCse:檢驗是否含有i reg.multiline:檢驗是否含有m reg.source:檢視reg裡的內容 lastIndex:一個整數,標示開始下一次匹配的字元位置,可以手動更改。 例1: var reg = /^\d|\d$/g; reg.global:true reg.ignoreCse: reg.multiline:false reg.source:^\d|\d$
7.RegExp物件方法 compile 編譯正則表示式。 test 檢索字串中指定的值。返回 true 或 false。 exec 檢索字串中指定的值。返回找到的值,並確定其位置。 例1:一般exec和lastIndex配合使用 var reg = /ab/g; //不加g的話lastIndex一直都是從0開始的,不變,一直都是0 var str = "abababab"; //str.match(reg) 返回結果為["abcdef"]; console.log(reg.lastIndex); //輸出遊標的位置,每次匹配結束的位置就是index開始的位置,這個為0,每次匹配完會自動往後飄 console.log(reg.exec(str)); //index:0 console.log(reg.lastIndex); //輸出遊標的位置,每次匹配結束的位置就是index開始的位置,這個為2 console.log(reg.exec(str)); //index:2 console.log(reg.lastIndex); //輸出遊標的位置,每次匹配結束的位置就是index開始的位置,這個為4 console.log(reg.exec(str)); //index:4 console.log(reg.lastIndex); //輸出遊標的位置,每次匹配結束的位置就是index開始的位置,這個為6 console.log(reg.exec(str)); //index:6 console.log(reg.lastIndex); //輸出遊標的位置,每次匹配結束的位置就是index開始的位置,這個為8 console.log(reg.exec(str)); null console.log(reg.lastIndex); //輸出遊標的位置,每次匹配結束的位置就是index開始的位置,這個為0 console.log(reg.exec(str)); //index:0(遊標在一圈一圈的輪)
8.拓展知識 /(a)/ :(a)叫做子表示式,括號會記錄裡面匹配的內容 /(a)\1/: 反向引用第一個子表示式裡面匹配的內容 例1:(不懂,為什麼是2呢,怎麼不是3) var reg = /(\w)\1(\w)\2/g; var str = "aabb"; 這樣就匹配出來了aabb 例2: var reg = /(\w)\1(\w)\2/g; //加不加g都一樣 var str = "aabb"; console.log(reg.exec(str)); 返回類陣列多出來兩位"a","b"分別是第一個子表示式匹配內容,和第二個子表示式匹配內容而且多出來這兩位是正式的資料位,是掛在陣列上的索引位的 0:"aabb" 1:"a" 2:"b"
9.支援正則表示式的Sting物件的方法 (1)search 檢索與正則表示式相匹配的值。 匹配成功:但凡返回的不是-1,都算成功了。返回的是匹配到東西的位置,search就是不管匹配多少個,它關注的就是能不能匹配到,並返回位置,不管有多少個,匹配不到就返回-1 例2: var reg = /(\w)\1(\w)\2/g; var str = "123aabb344ddee"; console.log(str.search(reg)); 返回的就是3 (2)match 找到一個或多個正則表示式的匹配。 例1: var reg = /(\w)\1(\w)\2/g; var str = "aabb"; console.log(str.match(reg)); 只返回["aabb"],但是要是不加g的話,返回的就和exec就差不多了,像8中的例2一樣。 (3)split 把字串分割為字串陣列。 (4)replace 替換與正則表示式匹配的子串。 例3:replace var str = "aaa"; str.replace("a","b"); 這個replace沒有訪問全域性的能力,只能訪問一個,所以返回結果為"baa" 例4: var reg = /a/; var str = "aaa"; str.replace(reg,"b"); 返回還是"baa",因為沒有g,就匹配了一個a 例5: var reg = /a/g; var str = "aaa"; str.replace(reg,"b"); 返回結果"bbb" 例6:將所有類似aabb形式轉換為bbaa形式($也能實現反向引用到reg匹配到的(\w)中的資訊) 第一種解法: var reg = /(\w)\1(\w)\2/g; var str = "aabb"; str.replace(reg,"$2$2$1$1"); 第二種解法: var reg = /(\w)\1(\w)\2/g; var str = "aabbeghjkabbcc"; str.replace(reg,function($,$1,$2){ /*$:正則表示式匹配的全域性,$1:第一個子表示式匹配的內容,$2:第二個子表示式匹配的內容,*/
return $2+ $2 + $1 + $1; /*因為$1$2是變數,而且是字串型別*/ }); 將結果變大寫:str.toUpperCase() 將結果變小寫:str.toUpperCase() 例7:the-first-name 變為小駝峰式寫法 var reg = /-(\w)/g; var str = "the-first-name"; console.log(str.replace(reg,function($,$1){ /*必須先寫$ 再寫$1,要不然$1引不過來*/ /*reg找了兩次,這個函式也執行了兩次*/ return $1.toUpperCase(); })); 結果為:theFirstName