一 元字符javascript
\b 單詞邊界 \d 數字 [0-9] \w 英文 數字 下劃線 [a-z0-9_] \s 空白字符[\t\v\n\r\f] \t水平製表符,\v垂直製表符,\n換行符,\r回車符,\f換頁符 反義 \B 非單詞邊界 \D [^0-9] \W [^a-z0-9_] \S 非空白字符 [^\t\v\n\r\f] . 任意字符 少用 .* 任意數量的不包含換行的字符 貪婪匹配 .? 懶惰 非貪婪匹配 \u4e00-\u9fa5 中文
二 量詞html
{m,n} 匹配m-n次,優先匹配m次 {n,} 匹配n或以上次 {n} 匹配n次 ? 0或1,有或無 等於{0,1} + 1或以上等於{1,} * 0或n均可以 任意 等於{0,} eg: /\d?/ //匹配1或0個數字 /\d{2,4}/ //匹配2到4個數字 /\s+java\s+/ //匹配有1個或多個空格的字符串java /[^(]*/ //匹配1個或多個左括號
三 集合 字符類java
[abc] 匹配a/b/c任意字符 [^abc] 匹配除了abc外的任意字符 [a-z] 匹配a到z任意字符 //注意:裏面的-表明的是範圍 例如 'ahd-fj-k'.replace(/[a-z]/g,'A') //輸出 》AAA-AA-A //若是我想把斜槓也替換了呢 有兩個方法 1. 利用轉義符\ 'ahd-fj-k'.replace(/[a-z\-]/g,'B') //輸出BBBBBBBB 2. 後面加多一個- 'ahd-fj-k'.replace(/[a-z\-]/g,'B') //輸出BBBBBBBB //() 在集合裏面默認被轉義了 like this //'(122)do('.replace(/[(\d)]/g,'A') 輸出 AAAAAdoA //具體被轉義範圍不肯定 歡迎普及補充
四 分支正則表達式
123|34|567 //匹配123或34或567
五 邊界 開始結束數組
^ //表明開始 在[]表明非 $ //表明結束
六 修飾符函數
g //全局匹配 不寫的話匹配完第一個就中止 i //忽略大小寫 m //忽略換行 //上面3可疊加使用
七 貪婪模式和非貪婪模式
js默認貪婪模式 即最大可能的匹配
想要改爲非貪婪模式在後面加個?性能
例子: '123456789'.replace(/\d{3,6}/,'XX') //輸出XX //貪婪模式先匹配了最多的 6個數字》X 剩下3個數字也算是符合就再多一個X '123456789'.replace(/\d{3,6}?/,'XX') //輸出XXX //非貪婪模式 優先匹配了最低要求的3個數字一次 〉 3個X
八 分組與引用與捕獲
分組是正則中很是強大的功能 可讓上面提到的量詞做用與一組字符。
語法 圓括號包裹(*);網站
/([0-9])[a-z]+\1{3}/.test('2aa222') //true /([0-9]+)[a-z]+\1/.test('12aa12') //true /([0-9]+)[a-z]+\1/.test('12aa13') //false //這裏須要注意一個問題。分組"\1"表示的並非多個數字,而是和對應分組如出一轍的數字 /<([a-z]+)>.*<\/\1>/.test('sdlk<div>sdjks</div>sdkl') // true
並非全部用()起來的就能被捕抓成爲分組的。
下面就要說到 非捕抓分組能夠提升性能和簡化邏輯
用法:this
**(***) //識別成爲可捕抓分組 (?:***) //識別成爲非捕抓分組** 例子: 把a1b2c3d4裏面的數字都+1 'a1b2c3d4'.replace(/(\d)/g,function($1){ return $1*1+1 }) //輸出 a2b3c4d5 把2015-12-25 格式成 12月25日2015年 '2015-12-25'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2月$3日$1年') //輸出 12月25日2015年 非捕抓例子: '2015-12-25'.replace(/(\d{4})-(?:\d{2})-(\d{2})/g,'$2月$3日$1年') //第二個()裏面有?: 因此它不被捕抓成分組。 因而$1對應着2015, $2對應着25 //輸出 25月$3日2015年
九 前瞻
正則表達式從文本頭部想穩步開始解析,文本尾部方向,稱爲「前」。
簡單理解爲 從左到右spa
前瞻就是 向前檢查是否屬於斷言。
後顧/後瞻方向相反 可是javascript不支持後瞻。
正向前瞻 例子: 'a2*3w4sb'.replace(/\w(?=\d)/g,'X') //輸出X2*3X4sb //主角是\w 只對它進行匹配。 //(?=\d)這個就是斷言 就是條件。只是條件不參與匹配 //找\w (英文|數字|下劃線) 並且後面跟着\d 數字的。 //因此符合的有 a2的a w4的w; 負向前瞻 例子: 'a2*3w4sb'.replace(/\w(?!\d)/g,'X') //輸出 aX*XwXX //主角是\w 只對它進行匹配。 //(?!\d)這個就是斷言 就是條件。只是條件不參與匹配 //找\w (英文|數字|下劃線) 並且後面不是\d 數字的。 //因此符合的有 2*的2 3w的3 4s的4 sb的s b後面什麼都沒跟因此符合;
Js風格 調用RegExp對象的構造函數 var reg = new RegExp('^[a-z]+[0-9]$', 'gi') Perl風格 寫在斜槓中 var reg = /^[a-z]+[0-9]$/gi
經常使用
test 返回布爾值
例子: /^\d+$/.test('12637') //true /^\d+$/.test('sdk') //false
search 返回搜索到的對應位置 沒有則-1
//注意 search只查找一次,即便設置了g。重複調用也是從起始位置開始
例子 'ad1cd2c'.search(/\d/g) //2 第一個數字的位置 'adcd'.search(/\d/g) //-1 找不到
replace 替換
('a1b2c3').replace(/\d/g,'數字') //a數字b數字c數字
split 分割成數組 裏面也能寫正則。 若是找不到匹配分割的把本身變數組
'a12b23c34'.split('1') //["a", "2b23c34"] 'a12b23c34'.split(/\d{2}/g) //["a", "b", "c", ""] 'a12b23c34'.split(/[23]/g) //["a1", "b", "", "c", "4"] 'a12b23c34'.split(/[55]/g) //["a12b23c34"]
match 與 exec 返回數組 匹配到的字符串
二者類似又不一樣。 寫法上不同
match是字符串方法,寫法爲:str.match(reg)
exec是正則表達式方法,寫法爲:reg.exec(str)
寫法: var reg = new RegExp("abc") ; var str = "3abc4,5abc6"; str.match(reg); var reg = new RegExp("abc") ; var str = "3abc4,5abc6"; reg.exec(str ); --------------------------------------- 無子表達式非全局時: **exec和match執行的結果是同樣,均返回第一個匹配的字符串內容;** var reg = new RegExp("[a-z]+") ; var str = "1abc2,3abc4"; alert(str.match(reg)); alert(reg.exec(str)); //都是輸出 abc 無子表達式全局匹配 : **match執行了全局匹配查詢;exec找到一個匹配即返回。** var reg = new RegExp("[a-z]+","g") ; var str = "1abc2,3bcd4"; console.log(str.match(reg)); //["abc", "bcd"] console.log(str.match(reg)); //["abc", "bcd"] console.log(reg.exec(str)); //["abc"] console.log(reg.exec(str)); //["bcd"] //match執行了全局匹配查詢;而exec逐次返回。 有子表達式 非全局: **match exec 都是返回結果 和分組** var reg = new RegExp("a(bc)") ; var str = "3abc4,5abc6"; console.log(str.match(reg)); //["abc", "bc"] console.log(reg.exec(str)); //["abc", "bc"] 有子表達式 全局: **match忽略子表達式,只查找全匹配正則表達式並返回全部內容; exec 依然逐次返回結果 分組 ** var reg = new RegExp("a(bc)","g") ; var str = "3abc4,5abc6"; console.log(str.match(reg)); // ["abc", "abc"] console.log(str.match(reg)); // ["abc", "abc"] console.log(reg.exec(str)); // ["abc", "bc", index: 1] console.log(reg.exec(str)); // ["abc", "bc", index: 7]
/^\d+$/.test('2l') //只能輸入數字 /^\d{n}$/.test('2222') //只能輸入n個數字 /^\d{n,}$/.test('22222') //只能輸入n個以上數字 /^\d{m,n}$/.test('22222') //只能輸入m到n個數字 /^[a-z]+$/i //只能輸入英文 /^[A-Z]+$/.test('SS’) //只能輸入大寫英文 /^[0-9a-z]+$/i.test('1223ddsSSk') //只能輸入英文和數字 /^\w+$/.test('wS233_') //只能英文數字下劃線 /^[\u4e00-\u9fa5]+$/.test('你們看') //純中文 //匹配手機號 : 手機號 1開頭 34568 第二位 數字任意9位 /^1[3|4|5|6|8]{1}\d{9}$/.test('13347834892') //匹配日期格式 YYYY-MM-DD 1/2開頭 3個數字 - [0|1][1-9] - [0-1][1-9] /^[1-9]\d{3}-[0-1]\d-[0-3]\d$/.test('2017-12-20') //過濾html標籤: 以<開頭 >結尾的標籤 '幕中閃着兇光。<br/><p/>索拉卡'.replace(/<[^<>]+>/g,'') //簡單版匹配email郵箱:英文數字下劃線 @ 英文數字 .com /^\w+\@[a-z0-9]+(.com)$/.test('@qq.com') // 網上看到的Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
有不少在線正則可視化的網站也是頗有意思 寫了能夠拷貝進去檢查看看。
點擊跳轉去正則可視化網頁
mark一下 僅供參考 歡迎更正補充 end