1.1 分組
反向引用的使用是基於分組的,所以得先理解清楚正則中分組的概念。什么是分組?個人理解的分組是正則匹配的一個或者多個字符,通常像元字符\w,\d,\s只能匹配一個字符,或者 [ ] 范圍的匹配也只是匹配一個字符。但是當需要匹配重復的組的時候,例字符串:“asd123asd123”,不使用分組的正則寫法是
1 var str = "asd123asd123"; 2 var reg = /[a-z]{3}[1-9]{3}/; 3 reg.test(str); //true
這種寫法不但違反計算機科學原理,程序猿看上去還覺得別扭(眾所周知,重復的代碼都習慣了封裝),所以我所理解的分組,其實就是正則表達式中的一種 “封裝” 而已。那么經過封裝后,上面的寫法可以改寫為
1 var str = "asd123asd123"; 2 var reg = /([a-z]{3}[1-9]{3})\1+/;
3 reg.test(str); //true
但是正則中的“封裝“有個特點,就是引用時,引用的並非分組里面的正則表達式,而是已經匹配成功的內容,從以下代碼說明這點
1 var str = "asd123dsa321"; 2 var reg = /([a-z]{3}[1-9]{3})\1+/;
3 reg.test(str); // false, \1引用匹配的是已經匹配成功的asd123
分組的概念理解到這里,下面繼續來學習后向引用
1.2 后向引用
其實在上面的例子中,已經使用到了正則的后向引用。先來看看后向引用的概念---------“使用小括號指定一個子表達式后,匹配這個子表達式的文本可以在表達式或其它程序中作進一步的處理。默認情況下,每個分組會自動擁有一個組號,規則是:以分組的左括號為標志,從左向右,第一個分組的組號為1,第二個為2,以此類推。后向引用用於重復搜索前面某個分組匹配的文本。”
從概念中可以看出,其大概意思是使用正則去匹配字符串的時候,由於字符串中可能出現重復匹配的字符。那么先定好規則,當最左邊的分組規則(即括號內的規則匹配成功時,記錄匹配成功的字符串,給其一個\1好讓后面繼續拿來使用),第二個給\2,第三個給\3......
1 var str = "asd123zxc"; 2 var reg = /(asd)((1)(2)(3))(zxc)/; 3 reg.exec(str); // ["asd123zxc", "asd", "123", "1", "2", "3", "zxc", index: 0, input: "asd123zxc"] 4 5 //觀察這里的數組可以發現,\0 代表要匹配的整體, \1 為第一個分組, \2為第二個分組整體((1)(2)(3)), \3 為第二個分組內的子分組(1).......
這里面的重點是要理清分組中的嵌套關系。
后向引用還有另外一個用法,就是$1,$2,$3......
1 var str = "asd123asd123"; 2 var reg = /([a-z]{3}[1-9]{3})/; 3 4 str.replace(reg,"--$1--"); //"--asd123--asd123"
