原來也接觸一些正則表達式的編寫,感受通常的正則表達式應該都沒有什麼問題,可是同事最近問了系統登陸密碼驗證的正則怎麼寫,需求:密碼必須包含大寫字母,小寫字母和數字,想了一下想到了分組,想到如何無序驗證,最後都失敗了,看來仍是太菜,平時寫的一些正則表達式都是一些比較簡單,什麼惰性,分組等的。以後就在網站找了一下,看到下邊一篇文章,看過以後恍然大悟,看來本身仍是太菜根基不了啊。抄了一下文章內容,整理一下本身理解,作個筆記。javascript
javascript中捕獲性分組是以小括號()來實現,捕獲性分組工做模式()會把每一個分組裏匹配的值保存起來。java
好比利用捕獲性分組把 hello world 互換成 world hello:正則表達式
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
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
var str = 'hello world'; var pattern = /([a-z]+)\s([a-z]+)/; var n_str = str.replace(pattern,"$2 $1"); //這裏的$一、$2與方法二里的RegExp.$一、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 = pattern.exec(str2); console.log(arr2) //['aaa111'] 結果正確
前瞻分爲正向前瞻和反(負)向前瞻,正向前瞻(?=表達式)表示後面要有什麼,反向前瞻(?!表達式)表示後面不能有什麼。網站
前瞻分組會做爲匹配校驗,但不出如今匹配結果字符裏面,並且不做爲子匹配返回。.net
正向前瞻匹配一批圖片格式:code
//正向前瞻,匹配.jpg後綴文件名 var str = '123.jpg,456.gif,abc.jpg'; var partern = /\w+(?=\.jpg)/g; //正向前瞻匹配 console.log(str.match(partern)); //['123', 'abc'] 返回結果正確,沒有匹配456.gif
反向前瞻匹配一批字母加數字:blog
//反向前瞻,匹配3個及以上的a,並且後面不能有000的字符 var str = 'aaa000 aaaa111 aaaaaaa222'; var partern = /a{3,}(?!000)/g; //反向前瞻匹配 console.log(str.match(partern)); //['aaaa', 'aaaaaaa'] 返回結果正確,沒有匹配aaa000
前瞻,能夠放在位置不固定,可前匹配和後匹配,如:/(?=.jpg)\w+/g;圖片
後顧分爲正向後顧和反(負)向後顧,正向後顧(?<=表達式)表示前面要有什麼,反向後顧(?<!表達式)表示前面不能有什麼。
/正向後顧 (?<=abc) //前面須要有abc //反向後顧 (?<!abc) //前面不能有abc
名詞解釋:
前瞻 = 先行斷言
(?=) 正向前瞻 = 正向零寬先行斷言
(?!) 反向前瞻 = 負向前瞻 = 負向零寬先行斷言
後顧 = 後發斷言
(?<=) 正向後顧 = 正向零寬後發斷言
(?<!) 反向後顧 = 負向後顧 = 負向零寬後發斷言
能夠經過多個前瞻組合一塊控制,字符串裏邊必須包含指定字符。
示例:
(?=.[0-9].)(?=.[A-Z].)(?=.[a-z].).{6,20} 能夠匹配包含大寫字母,小寫字母,數字