1. 程式人生 > >js筆記(正則表示式續)

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