第一部分:新建正則表達式javascript
JavaScript中正則表達式是參照Perl 5(一門歷史很悠久的語言,如今tiobe編程語言排行依然在10名左右)創建的。html
新建正則表達式的方法有兩種:java
1.使用字面量(斜槓/開始和結束) 注:字面量:表示固定值的符號。能夠簡單理解爲表示值最簡單、最基本的寫法。正則表達式
1 var reg1=/test/; 2 console.log(reg1,typeof reg1);
運行結果:編程
2.使用RegExp構造函數。數組
1 var reg2=new RegExp('test'); 2 console.log(reg2,typeof reg2);
運行結果:app
注意:雖然二者運行結果一致。可是它們仍是存在着差異:第一種方法是在編譯時(代碼載入時)新建正則表達式;而第二種是在運行時(代碼執行時)新建正則表達式。編程語言
通常均採用字面量的寫法,推薦!函數
第二部分:RegExp對象的屬性和方法es5
2.1屬性
2.1.1:修飾符,返回布爾值
1 var reg3=/test/ig; 2 console.log(reg3.ignoreCase,reg3.global,reg3.multiline);
運行結果:
2.1.2 :不是修飾符
1 var reg3=/test/ig; 2 console.log(reg3.lastIndex,reg3.source);
運行結果:
2.2方法
2.2.1 test():當前模式是否能匹配參數字符串
以下:'test_test_'參數字符串包含模式test,因此返回true。
1 var res1=/test/.test('test_test_'); 2 console.log(res1);//true
正則表達式帶有g修飾符:每次進行匹配的位置是上一次匹配成功的位置+1;若是匹配不成功,那麼又會從頭開始進行匹配
1 var res1=/test/.test('test_test_'); 2 console.log(res1);//true 3 4 var reg4=/a/g; 5 var s='abcabcabc'; 6 7 console.log(reg4.lastIndex);//0 8 console.log(reg4.test(s));//true 9 10 console.log(reg4.lastIndex);//1:上次匹配成功的位置+1 11 console.log(reg4.test(s));//true 12 13 console.log(reg4.lastIndex);//4 14 console.log(reg4.test(s));//true 15 16 console.log(reg4.lastIndex);//7 17 console.log(reg4.test(s));//false 18 19 //又開始從頭進行匹配 20 console.log(reg4.lastIndex);//0 21 console.log(reg4.test(s));//true
運行結果:
所以,帶有g修飾符的正則對象,咱們能夠經過lastIndex屬性進行指定開始匹配的位置
1 var reg5=/a/g; 2 var s1='aaaaab'; 3 reg5.lastIndex=5; 4 console.log(reg5.test(s1));//false
若是正則模式是一個空字符串,則匹配全部字符串
1 console.log(new RegExp('').test('abc'));//true
2.2.2:exec():匹配成功,返回數組;匹配失敗,返回null
1 var reg6=/ab/; 2 var s2='abcabcd'; 3 console.log(reg6.exec('cdef'));//匹配不成功,null 4 console.log(reg6.exec(s2));
運行結果:
因此能夠明顯看出:exec()返回的數組中還包含着index和input屬性。
若是正則表達式中包含圓括號(即"組匹配"),返回的數組會包含多個成員;第一個成員是整個匹配成功的結果,第二個成員是圓括號裏面匹配成功的結果。以此類推
1 var reg7=/_(ab)/; 2 var s3='_abc_abcd'; 3 console.log(reg7.exec(s3));
運行結果:
第一個成員是整個匹配的結果;第二個參數是圓括號匹配的結果。
非捕獲組:(?:):表示不返回該組匹配的內容;也就是說匹配的結果不計入括號
1 var m1='abc'.match(/(.)b(.)/); 2 var m2='abc'.match(/(?:.)b(?:.)/); 3 console.log(m1); 4 console.log(m2);
運行結果:
若是正則表達式加上g修飾符,則能夠屢次使用exec方法:
1 console.log('---'); 2 var reg8=/_(a+)_/g; 3 var s4='_a_bc_aa_de_a_f'; 4 var res1=reg8.exec(s4); 5 console.log(res1,res1.index,reg8.lastIndex);// 0 3 6 var res2=reg8.exec(s4); 7 console.log(res2,res2.index,reg8.lastIndex);// 5 9 8 var res3=reg8.exec(s4); 9 console.log(res3,res3.index,reg8.lastIndex);// 11 14 10 var res4=reg8.exec(s4); 11 console.log(res4,reg8.lastIndex);//此處不能讀取index,由於爲null,讀取則報錯 12 var res5=reg8.exec(s4); 13 console.log(res5,res5.index,reg8.lastIndex);// 0 3
運行結果:
第三部分:字符串對象方法
3.1:String.prototype.match():字符串的match()方法與正則對象的exec()方法十分類似:匹配成功返回數組;匹配失敗返回null;
區別:當正則表達式帶有g修飾符,match()會返回全部結果;而exec()返回一個結果。
1 var reg9=/te/; 2 var s5='teatebtec'; 3 console.log(s5.match(reg9)); 4 console.log(reg9.exec(s5)); 5 var reg10=/te/g; 6 console.log(s5.match(reg10)); 7 console.log(reg10.exec(s5));
運行結果:
注意:設置lastIndex屬性對match()方法無效。
1 reg10.lastIndex=2; 2 console.log(s5.match(reg10),reg10.lastIndex);
運行結果:
能夠看出此時reg10.lastIndex依然爲0。代表每次match()匹配都是從第一個字符開始的。
3.2 String.prototype.search():返回第一次匹配成功在整個字符串的位置;不然返回-1
一樣的,設置lastIndex屬性對search()無效;而且search()會忽略g修飾符
1 var reg11=/te/; 2 var s6='te_teabc'; 3 console.log(s6.search(reg11));//0 4 reg11.lastIndex=2;//設置lastIndex屬性無效 5 console.log(s6.search(reg11),reg11.lastIndex);//0 2 6 var reg12=/te/g;//設置g修飾符無效 7 console.log(s6.search(reg12));//0
運行結果:
3.3 String.prototype.replace():返回替換後的字符串;有兩個參數,第一個是搜索模式(正則),第二個是替換的內容
1 console.log('abaac'.replace('a','F'));//Fbaac 2 console.log('abaac'.replace(/a/,'F'));//Fbaac 3 console.log('abaac'.replace(/a/g,'F'));//FbFFc
運行結果:
3.4 String.prototype.split():按照正則規則切割字符串;返回數組包含切割後的部分
1 console.log('a, b,c'.split(','));//["a", " b", "c"] 2 console.log('a, b,c'.split(/, */));//["a","b","c"]
4.匹配規則
4.1:字面量字符(literal characters):好比:/a/,/cat/
4.2:元字符(meta characters):有特殊含義;不表明字面意思
4.2.1:點字符(.):匹配除回車(\r)、換行(\n)、行分隔符(\u2028)和段分隔符(\u2029)之外的全部字符。
4.2.2:位置字符
4.2.3:選擇字符:豎線符號(|):表示或的關係;好比apple|boy:匹配apple或者boy
4.2.4:轉義符:由於有些字符在匹配規則中有着特殊的含義,因此要想匹配它們,得進行轉義(在前面加上反斜槓\);好比匹配^,寫成\^
須要轉義的12個字符:^;.;[;$;(;);|;*;+;?;{和\\
注意:若是使用RegExp生成正則對象,轉義須要兩個反斜槓,由於字符串內部轉義須要一次\
1 //匹配'+abc'字符串 2 var reg13=new RegExp('\\+abc');//正確寫法 3 var reg14=new RegExp('\+abc');//錯誤寫法
4.2.5:特殊字符
4.2.6:字符類:放置在[]中
1. ^:放置在[]中首位;如:[^abc]表示除a,b,c以外的字符都能進行匹配;若是[]中沒有其它字符,表示匹配一切字符(包括換行符);而.是不包括換行符的。
2. -:如:[a-z]:匹配a-z這26個字符
4.2.7:預約義模式:
4.2.8:重複類
精確匹配次數:{n}:重複n次;{n,}:至少n次;{n,m}:n到m次
4.2.9:量詞符
4.2.10:貪婪模式:(?,*,+)默認狀況下,最大可能的匹配;改成非貪婪模式,在量詞後面加個?
如:/a+?/:一旦匹配成功,就不會繼續匹配下去