1. 程式人生 > >JavaScript正則表示式分組模式:捕獲性分組與非捕獲性分組及前瞻後顧(斷言)

JavaScript正則表示式分組模式:捕獲性分組與非捕獲性分組及前瞻後顧(斷言)

javascript正則表示式裡分組模式以小括號來()表示分組,例:/([a-z])/

捕獲性分組:()

捕獲性分組工作模式()會把每個分組裡匹配的值儲存起來。

比如利用捕獲性分組把 hello world 互換成 world hello:

方法一:通過exec函式

var str = 'hello world';            //首先建立好字串
var pattern = /([a-z]+)\s([a-z]+)/; //先通過正則匹配這個字串,用分組模式來獲取這兩個單詞
var arr = pattern.exec(str); // exec方法返回的是一個數組,包含匹配到的字串以及分組(也稱子串)裡的值
console.log(arr); //['hello world','hello','world'] console.log(arr[0]); //'hello world' 匹配到的字串 console.log(arr[1]); //'hello' 第一個分組([a-z]+)的值 console.log(arr[2]); //'world' 第二個分組([a-z]+)的值 //這時候兩個分組的值都得到了,接下來用字串拼接法實現互換 var n_str = arr[2]+' '+arr[1]; console.log(n_str) //world hello

方法二:通過屬性$1-9

var str = 'hello world'
; var pattern = /([a-z]+)\s([a-z]+)/; pattern.test(str); //這個地方必須執行正則匹配一次,方式不限,可以是test()、exec()、以及String的正則方式 console.log(RegExp.$1) //'hello' 第一個分組([a-z]+)的值 console.log(RegExp.$2) //'world' 第二個分組([a-z]+)的值 var n_str = RegExp.$2+' '+RegExp.$1; console.log(n_str) //world hello

方法三:通過String的replace()

var str = 'hello world'; 
var pattern = /([a-z]+)\s([a-z]+)/; 
var n_str = str.replace(pattern,"$2 $1"); //這裡的$1$2與方法二里的RegExp.$1、RegExp.$2作用是相同的。
console.log(n_str) //world hello

非捕獲性分組:(?:)

非捕獲性分組工作模式下分組(?:)會作為匹配校驗,並出現在匹配結果字元裡面,但不作為子匹配返回。

比如利用非捕獲性分組獲取字串000aaa111,而且只返回一個值為aaa111的陣列:

//先看用捕獲性分組匹配會返回什麼
var str1 = '000aaa111';             
var pattern = /([a-z]+)(\d+)/; //捕獲性分組匹配
var arr = pattern.exec(str1);  
console.log(arr) //['aaa111','aaa','111']   結果子串也獲取到了,這並不是我們想要的結果


//非捕獲性分組
var str2 = '000aaa111';
var pattern2 = /(?:[a-z]+)(?:\d+)/; //非捕獲性分組匹配
var arr2 = pattern2.exec(str2);  
console.log(arr2) //['aaa111']  結果正確    

前瞻:(?=)和(?!)

前瞻分為正向前瞻和反(負)向前瞻,正向前瞻(?=表示式)表示後面要有什麼,反向前瞻(?!=表示式)表示後面不能有什麼。

前瞻分組會作為匹配校驗,但不出現在匹配結果字元裡面,而且不作為子匹配返回。

正向前瞻匹配一批圖片格式:

//正向前瞻,匹配.jpg字尾檔名
var str = '123.jpg,456.gif,abc.jpg';
var partern = /\w+(?=\.jpg)/g; //正向前瞻匹配
console.log(str.match(partern)); //['123', 'abc']   返回結果正確,沒有匹配456.gif

反向前瞻匹配一批字母加數字:

//反向前瞻,匹配3個及以上的a,而且後面不能有000的字元
var str = 'aaa000 aaaa111 aaaaaaa222';
var partern = /a{3,}(?!000)/g; //反向前瞻匹配
console.log(str.match(partern)); //['aaaa', 'aaaaaaa']   返回結果正確,沒有匹配aaa000

後顧:(?<=)和(?<!) —JavaScript不支援

後顧分為正向後顧和反(負)向後顧,正向後顧(?<=表示式)表示前面要有什麼,反向後顧(?<!表示式)表示前面不能有什麼。

//正向後顧
(?<=abc) //前面需要有abc

//反向後顧
(?<!abc) //前面不能有abc

名詞解釋:

前瞻 = 先行斷言
(?=) 正向前瞻 = 正向零寬先行斷言
(?!) 反向前瞻 = 負向前瞻 = 負向零寬先行斷言

後顧 = 後發斷言
(?<=) 正向後顧 = 正向零寬後發斷言
(?<!) 反向後顧 = 負向後顧 = 負向零寬後發斷言