正則表達式總結

正則表達式( regular expression )

  • RegExp
  • 用處: 匹配, 驗證; 替換, 截取, 分析

元字符

#### 基本元字符:

       匹配任意的非換行字符, 經常表示通用元字符使用 [\s\S]
       匹配一個出如今 [] 中的字符, [123456789123456789123456789], [a-z0-9A-Z]
       計算機只認識 數字, 因此咱們寫的字符串計算機其實不是以字符串的形式存儲
                        有一個編碼系統: unicode
                             '0'                 48
                             '1'                 49
                             ...
                             '9'                 57
                         寫上:  '012' , 在內存中存儲: 48 49 50 
                         須要記住的是:
                             '0'                 48
                             'a'                 97
                             'A'                 65
                             \u0030
         ()              1> 分組; 2> 提高優先級
         |               或者
                         匹配 foot 或者 food
                         foot|food
                         注意: | 具備最低優先級
                         ^(foot|food)$
   - 常見的用法
                         例如要匹配jq的屬性選擇器: 
                         [name]
                         [name=value]
                         用正則: \[\w+=\w+\]|\[\w+\]
                         jq 的寫法: \[\w+(=\w+|)\] 
                         (foot|food)     匹配: 'foot' 或者 'food'
                         (foot|)         匹配: 'foot' 或者 ''
                         food(=food|)    匹配: 'food=food' 或者 'food'
                         \w+(=\w+|)      匹配: '字符=字符' 或 '字符'
                         \[\w+(=\w+|)\]  匹配: '[xxx]' 或 '[xxx=vvv]'
                         \[\s*(\w+)\s*(?:([|!^$~]?=)\s*(\w+)|)\s*\]
                         =>
                        \[   \s*     (\w+)  \s*   (?:   ([|!^$~]?=)     \s*    (\w+)   |)   \s*   \]

#### 限定元字符

        +                   (abc)+              {1,}
        *                                       {0,}
        ?
        {n}
        {n,}
        {n,m}
#### 首尾元字符
        ^                   必須以 xxx 開頭
                            表示否認:
                                [abc]           用來匹配 一個 字符 a, 或 b, 或 c
                                [^abc]          用來匹配一個字符, 要求不容許是 a, b, c
        $                   必須以 xxx 結尾
                            表示組引用
                                a(b)c
#### 簡寫元字符
        \w                  word
        \W
        \s                  space
        \S
        \d                  digit
        \D
#### 其餘:
        (?: )
        \1

基本的匹配案例

如何匹配
    1) 匹配任意的天然數, 就是 0, 1, 2, 3, ...
        [0-9]  等價於 \d
        分類討論
            -> 一位數字: \d
            -> 兩位: [1-9]\d
            -> 任意位( 除了一位 ): [1-9]\d+
        合併: 
            \d|[1-9]\d+
        能夠進行演變( 用不一樣的方法寫同一個例子 )
            [1-9]\d*|0
            [1-9][0-9]*|0
            ...
    2) 匹配任意的整數, 0, +1, -1, +2, -2, ...
        [+-]?[1-9][0-9]*|0
        (+|-|)[1-9][0-9]*|0
        ...

    3) 匹配任意的實數, 0.01, 0.0000123, -0.1234567
        整數 + 小數部分
        分類( 劃歸 )
            ((+|-|)[1-9][0-9]*|0)(\.\d+|)

        沒法匹配 -0.1
        無非就是不容許匹配 -0.0+

        使用正則的原則: 夠用便可, 儘量寫成多步的判斷, 要保證正則表達式的儘量簡潔
        -0+(\.|)0*
        if ( !... ) {
            if ( ... )
        }
        \d{17}|[\dxX]
        \d{11}

    4) 匹配郵箱
        [^@]+@[^@]+
        若是想要嚴謹一點
        郵箱分紅用戶名 和 域名
        用戶名: 能夠有數字, 字母下劃線組成( 還有一些特殊字符 )
            [\w\-]+
        域名: xxx.com.cn.xxxx
            [\w\-]+(\.[\w\-]+)+

    5) 匹配 ip 地址
        採用數字點分的方法描述, 並且每個數字的取值在 0-255 之間, 均可以取到
        0.0.0.0
        255.255.255.255
        123.124.125.126
        ...
        \d{1,3}(\.\d{1,3}){3} 或者: \d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3} 

        利用正則實現匹配 0 到 255 的數字
        分類:
        一位: [0-9]
        兩位: 10-99
              [1-9][0-9]
        三位: 100-255
              開始爲 1 的: 100-199: 1[0-9][0-9]
              開始爲 2 的: 200-255: 
                中間爲 0-4 的: 2[0-4][0-9]
                中間爲 5 的: 25[0-5]

        [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]

        IP:
        [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\.[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\.[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]\.[0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]

 - 如配匹配計算機中的一個文件路徑全名
        例如: C:\myMusics\list\myFavorite\rain.MP3
            盤符: 一個字符: a-z, 簡單的寫 . 若是想要嚴格處理 [a-z]
            冒號和斜線: :\\
            路徑(文件夾的名字): .+\\ 若是想要精確: ([^|:\?\*><\\\/\"]+\\)* 
            文件名: .+\..+ 若是想要精確一點: [^|:\?\*><\\\/\"]+\.[^|:\?\*><\\\/\"]+

            組合起來:
                .:.*\\.+\..+
            注意: 正則表達式有貪婪模式
                 C:\myMusics\list\myFavorite\rain.MP3
                .:(.*)\\.+\..+
                .:.*\\.+.+
            若是一個正則表達式中有多個 .+ 或 .* 的結構, 若是形成了匹配的歧義, 知足一個規則. 即貪婪模式
            從左往右 匹配個數的能力是左強又弱, 並且只有兩個級別, 要麼強, 要麼弱

                例如: 
                    var s = '1234567890';
                    //        1 2 3
                    var r = /(.+)(.+)(.+)/;

                    var res = r.exec( s );
            例如匹配 div 標籤
                    var r = /<div.*?>.*<\/div>/;
            若是不但願有貪婪模式在 限定元字符( +, * 等 )後寫上 ?

字符串提取( 解析 )

.exec 方法
    利用正則表達式, 去處理字符串, 並將字符串中符合正則表達式的數據取出來 
    var s = '1234567';
    var r = /\d/;
    var m = r.exec( s );   // m 是 match 的簡寫, 表示捕獲
    // 若是匹配上了, 就返回數組, 第 0 項 就是匹配到的結果, 若是正則表達式中有 分組
    // 分組都是從 1 開始的編號, 那麼對應的 第 n 組匹配到的結果就在這個數組的第 n 項
    // 注意: 是真數組
    // 若是沒有匹配到 則返回 null

    分組: 就是 ()
    從左往右數 (, 第一個開始編號, 從 1 開始編號, 此時編號完成之後, 對應圓括號組成的就是對應的組
    //         1   2  34       5
    例如: r = /(\d)(\d((\d)\d))(\d)/;

    例子:獲取網頁中的QQ號: 
    想要作一個推廣, 在論壇中發佈我有XXX的視頻, 若是想要的留下郵箱
    若是有人留下的是 QQ 號, 將其拉到一個羣裏

    注意: exec 匹配提取, 只能匹配提取第一個被捕獲的數據
    若是須要匹配字符串中全部符合要求的字符串
    1) 開啓全局模式, 在正則後面寫上一個 g, 或在構造函數的 第二個參數中提供 'g'
        建立正則:
            -> 字面量:   /.+\\.+/g
            -> 構造函數: new RegExp( '.+\\\\.+', 'g' )
    2) 開啓全局模式後, 使用 正則表達式對象 調用 exec 方法一次, 就會從 0 位置或上一次結束的位置開始
        查找下一個匹配結果, 若是查找到結果則返回對應數組, 若是沒有查找到( 即, 找完了 )就會返回 null.
        若是還繼續調用 exec, 那麼就從頭開始再查一次.
    例如:
        var s = '123';
        var r = /\d/g;

        r.exec( s );   // [ '1' ]
        r.exec( s );   // [ '2' ]
        r.exec( s );   // [ '3' ]
        r.exec( s );   // null
        r.exec( s );   // [ '1' ]
        ...

        通常要取到全部的數據, 可使用下面的代碼結構
        var m;
        while ( ( m = r.exec( s ) ) != null ) {
            // 此時 m 就是找到的結果
        }

字符串替換

.replace( 正則表達式, 須要替換的字符串 )
    1) 將一個字符串中全部的 - 換成一個連線
        var s = 'a-----------------------------------b----------------------c----d';
        // => a-b-c-d
        var res = s.replace( /-+/g, '-' );
        應用背景

            /\*.*?([\r\n]+.*?)*\*/

        換行: \r\n
        所以 \r 是回車的意思
             \n 是換行的意思
        平時在處理換行的時候要注意: 在 有些時候是 \r\n, 有些時候是 \n
        在 類 Unix 操做系統中( unix, linux, mac ) 換行都是 \n
        在 windows 中是 換行是 \r\n
    2) 在替換中還可使用組
        var s = '2012-3-4';
        // 在不一樣的系統中想要顯示成
        // 2012年3月4日
        // 3月4日2012年
        // 4/3/2012
        // ...
        var r = /(\d+)\-(\d+)\-(\d+)/;

        var res = s.replace( r, '$1年$2月$3日' )
    3) 替換的時候, 第二參數能夠是函數, 函數的參數爲, 匹配到的數組的散列值
        利用函數的返回值替換匹配到的結果

        var s = '2012-3-4';
        var r = /(\d+)\-(\d+)\-(\d+)/;

        s.replace( r, function ( match, g1, g2, g3 ) { 
            return g1 + '年' + g2 + '月' + g3 + '日';
        });

        電話號碼的加密
        var list = [
            '12345678901',
            '12345678912',
            '12345678923',
            '12345678934',
            '12345678945',
            '12345678956'
        ];

        var res = list.map( function ( v ) {
            //                 電話號碼的前4位
            //                              電話號碼的後 2 位
            return v.replace( /(\d{4})(\d+)(\d{2})/, function ( a, b, c, d ) {
                // a 就是匹配到的 電話號碼
                // b 就是匹配到的 電話號碼的前 4 位
                // c 就是匹配到的電話號碼的 中間 5 位
                // d 就是匹配到的電話號碼的 後 2 位
                return b + '***********'.slice( 0, c.length ) + d;
                // return b + '*****' + d;
            });
        });

    (?:)
    var s = '1234567';
    //        1   2       3     4
    var r1 = /(\d)(\d\d\d)(\d\d)(\d)/;
    r1.exec( s ); // => [ '1234567', '1', '234', '56', '7' ]
    \
    //        1             2     3
    var r2 = /(\d)(?:\d\d\d)(\d\d)(\d)/;
    r2.exec( s ); // => [ '1234567', '1', '56', '7' ]> 這裏輸入引用文本

但願對你們有幫助O(∩_∩)O~~linux

相關文章
相關標籤/搜索