JavaScript正則表達式(Regular Expression):RegExp對象

第一部分:新建正則表達式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:修飾符,返回布爾值

  • ignoreCase:忽略大小寫;i;屬性只讀
  • global:全局匹配;g;屬性只讀
  • multiline:多行匹配;m;屬性只讀
1 var reg3=/test/ig;
2 console.log(reg3.ignoreCase,reg3.global,reg3.multiline);

運行結果:

2.1.2 :不是修飾符

  • lastIndex:返回下一次搜索的位置;屬性可讀寫;設置了g修飾符纔有意義
  • source:返回正則表達式的字符串形式(不包括反斜槓);屬性只讀
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屬性。

  • index:模式匹配成功的第一個位置(0開始計數);
  • 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

運行結果:

 

第三部分:字符串對象方法

  • match():返回一個數組;成員是全部匹配的子字符串
  • search():返回一個整數;表示匹配開始的位置
  • replace():按照給定的正則表達式進行替換;返回替換後的字符串
  • split():按照給定規則對字符串進行分割;返回一個數組,包含分割後各個成員

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+?/:一旦匹配成功,就不會繼續匹配下去

 

 參考:阮一峯JavaScript標準參考教程

相關文章
相關標籤/搜索