關於正則表達式的一些筆記整理

基礎知識

一 元字符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

八 分組與引用與捕獲
分組是正則中很是強大的功能 可讓上面提到的量詞做用與一組字符。
語法 圓括號包裹(*);
圖片描述
clipboard.png網站

/([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不支持後瞻。

clipboard.png

clipboard.png

正向前瞻 例子:
'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+)*$

    clipboard.png

    有不少在線正則可視化的網站也是頗有意思 寫了能夠拷貝進去檢查看看。
    點擊跳轉去正則可視化網頁

    mark一下 僅供參考 歡迎更正補充 end

    相關文章
    相關標籤/搜索