#### 基本元字符: 匹配任意的非換行字符, 經常表示通用元字符使用 [\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