正則表達式及其使用例子
阿新 • • 發佈:2018-10-15
javabean inpu 包括 ole 死循環 最簡 默認 case amp
1 /** 2 * 直接量字符(這個沒有舉例子) 3 * 4 * 字母和數字字符 匹配自身 5 * \o NUL字符(\u0000),\t制表符(\u0009),\n換行符(\u000A) 6 * \v垂直制表符(\u000B),\f換頁符(\u000C),\r回車符(\u000D) 7 * \xnn由十六進制數nn指定的拉丁字符,如:\x0A等價於\n 8 * \uxxxx由十六進制數xxxx指定的Unicode字符,如:\0009等價於\t 9 * \cX控制字符^X,如:\cJ等價於換行符\n 10 */ 11 12 13 /** 14 * 字符類: 將直接量字符放進方括號內“[]”,就組成了字符類,一個字符類匹配它所包含的任意字符15 * 16 * [...] 方括號內任意字符 , [^...] 不在方括號內任意字符 17 * . 除換行符合其他Unicode行終止符之外的任意字符 18 * \w 任何ASCII字符組成的單詞 等價於[a-zA-Z0-9],\W 與 \w 相反 等價於 [^a-zA-Z0-9] 19 * \s 任何Unicode空白符,\S 與 \s 相反 20 * \d 任何ASCII數字,\D 與 \d 相反 21 * [\b] 退格直接量 22 */ 23 console.log("e2ba53w".match(/\S/g));//輸出 [ ‘e‘, ‘2‘, ‘b‘, ‘a‘, ‘5‘, ‘3‘, ‘w‘ ]24 //可通過"^"符號來定義否定字符類,它匹配所有不包含在方括號內的字符。註意,在定義否定字符類時, 25 //需要將"^"符號作為左方括號內的第一個字符 26 console.log("ebaw".match(/[^abc]/g));//輸出 [ ‘e‘, ‘w‘ ] 27 28 29 /** 30 * 重復字符(原則:盡可能多地匹配 “貪婪”匹配) 31 * 32 * {n,m} 匹配前一項至少n次但不超過m次,{n,} 匹配前一項n次或更多次 33 * {n} 匹配前一項n次, ? 匹配前一項0次或1次,即{0,1}34 * + 匹配前一項1次或多次,即{1,} , * 匹配前一項0次或多次,即{0,} 35 */ 36 //“非貪婪”匹配,在待匹配的字符後跟一個"?"號即可 "??","+?","*?","{1,9}?" 37 // 正則表示式: "aaab".match(/a+b/) 匹配結果 "aaab",而不是 "ab" 38 // 因為正則表達式的模式匹配總是會尋找字符串中第一個可能的匹配位置 39 40 /** 41 * 選擇、分組、引用 42 */ 43 // "|" 用於分隔供選擇的字符,匹配順序從到右直到發現匹配項,若左邊的選擇項匹配,則忽略右邊的選擇項匹配 44 console.log("a3b45fd".match(/\d{2}|[a-z]{3}/));//輸出:"45" ,匹配2個數字或3個字母 45 46 //圓括號 47 //作用一:把單獨的項組合成子表達式,以便可以像處理一個獨立的單元那樣進行處理 48 //如:/(java)+(script)?/ 49 50 //作用二:在完整的模式中定義子模式,當一個正則成功地和目標字符串匹配時,可以從目標串中抽出圓括號中的子模式想匹配的部分 51 //如下面執行結果為:輸出:[ ‘123abc666‘, ‘123‘, ‘abc‘, ‘666‘, index: 0, input: ‘123abc666‘ ] 52 console.log("123abc666".match(/([0-9]*)([a-z]+)(666)/)); 53 54 //作用三:允許正則表達式的後部引用前面的子表達式,通過字符"\"後加一位或多位數字實現 55 //如:對 /([jJ]ava([Ss]cript)?)\sis\s(fun\w*)\s\2/ 來說,"\2" 指代 ([Ss]cript)所匹配的文本的引用 56 console.log("javascript is fun script".match(/([jJ]ava([Ss]cript)?)\sis\s(fun\w*)\s\2/)); 57 //輸出:[ ‘javascript is fun script‘,‘javascript‘,‘script‘,‘fun‘,index: 0,input: ‘javascript is fun script‘ ] 58 //解析:([Ss]cript) 在正則中匹配的是 ‘script‘ ,因此 \2 也匹配 ‘script‘ 59 60 //註:對正則表達式中前一個表達式的引用,並不是對子表達式模式的引用,而是指與那個模式相匹配的文本的引用,不能再字符類中使用 61 //如:/[‘"][^‘"]*[‘"]/ 不要求左側引號和右側引號匹配,字符串 ‘fd3" 可以正確匹配 62 console.log(" ‘fd3\" ".match(/[‘"][^‘"]*[‘"]/));//輸出:‘fd3" 63 //如:/[‘"][^‘"]*\1/ 由於 \1 “是指與那個模式相匹配的文本的引用” ,如果前面匹配的文本為單(雙)引號 ‘(") ,那麽後面也要匹配單(雙)引號 ‘(") , 64 console.log(" ‘fd3\" ".match(/([‘"])[^‘"]*\1/));//輸出:null 65 console.log(" ‘fd3‘ ".match(/([‘"])[^‘"]*\1/));//輸出:‘fd3‘ 66 //如:/[‘"][^\1]*\1/ 非法,不能再字符類中使用 67 68 //不想創建帶有數字編碼的引用,也可以對子表達式進行分組 69 //如:對 /([jJ]ava(?:[Ss]cript)?)\sis\s(fun\w*)/ 來說, "\2" 指代 (fun\w*) 70 71 72 /** 73 * 指定匹配位置 正則表達式中的錨字符(匹配的是正則表達式之間的位置,不匹配實際的字符) 74 * ^ 匹配字符串的開頭,多行檢索中匹配一行的開頭 75 * $ 匹配字符串的結尾,多行檢索中匹配一行的結尾 76 * \b 匹配一個單詞的邊界(即 \w和\W之間的位置,或位於字符\w和字符串的開頭或結尾的位置,匹配的是退格符) 77 * \B 與\b相反,匹配非單詞邊界的位置 78 * (?=p) 零寬正向先行斷言,要求接下來的字符都與p匹配,但不能包括匹配p的哪些字符 79 * (?!p) 零寬負向先行斷言,要求接下來的字符不與p匹配 80 */ 81 //如匹配單詞"javascript" 82 console.log("javascript".match(/^javascript$/));//輸出:"javascript" 83 //如 /\b[jJ]ava\b/ 匹配 "java"、" java"、"java ",不匹配"abcjava"或"javaabc" 84 console.log(" java".match(/\bjava\b/));//輸出:"java" 85 //如 /\B[Jj]ava/ 匹配 "abcjava",不匹配"java"或"javaabc"或" java" 86 console.log("abcjava".match(/\Bjava/));//輸出:"java" 87 88 //正向先行斷言 89 //如: /[Jj]ava([Ss]cript)?(?=\:)/ 要求 j(J)avas(S)cript 接下來的字符必須是冒號 : ,但匹配的結果不包括冒號 90 console.log("JavaScript: The Definitive Guide".match(/[Jj]ava(?:[Ss]cript)?(?=\:)/));//輸出:JavaScript 91 console.log("Java The Definitive Guide".match(/[Jj]ava([Ss]cript)?(?=\:)/));//輸出:null 92 93 //負向先行斷言 94 //如:/Java(?!Script)([A-Z]\w*)/ 要求 j(J)avas(S)cript 接下來的字符必須不能是字符串 Script 95 console.log("JavaScriptAbc".match(/Java(?!Script)([A-Z]\w*)/));//輸出:null 96 console.log("JavaBeans".match(/Java(?!Script)([A-Z]\w*)/));//輸出:JavaBeans 97 98 99 /** 100 * 修飾符 101 * 修飾符放在 “//”符號之外,在第二條斜線之後 102 * i 執行不區分大小寫的匹配 103 * g 執行一個全局匹配,即找出被檢索字符串的所有匹配項 104 * m 多行匹配模式,即如果檢索字符串包含多行,^和$處理匹配整個字符串的開始和結尾 105 * 還能匹配每一行的開始和結尾 106 */ 107 //如:/java$/im , i忽略大小寫,m匹配多行 108 console.log("Java\n is fun"); 109 /** 110 * 輸出: 111 * Java 112 * is fun 113 */ 114 115 116 /** 117 * 用於模式匹配的String方法: 118 * search()最簡單,不支持全局 119 * replace()很強大,默認不全局搜索 120 * match()最常用,默認不全局搜索 121 * split() 122 * 這些方法是 String.prototype 的方法,只不過它們支持正則表達式而已 123 */ 124 125 126 //search()參數是正則表達式,若參數不是正則則先轉換成正則 127 //返回第一個與之匹配的子串的起始位置,若找不到子串則返回-1, 128 console.log("javascript".search(/script/i));//輸出:4 129 130 131 //replace()替換操作,參數一:正則,參數二:替換字符串(還可以是函數) 132 //若參數一不是正則,則直接搜索該字符 133 var str=‘"Javascript":javascript:JavaScript:javaScript‘; 134 console.log(str.replace(/javascript/gi,"jAvAsCrIpT")); 135 //輸出:"jAvAsCrIpT":jAvAsCrIpT:jAvAsCrIpT:jAvAsCrIpT 136 137 //若在replace()替換字符串中出現 $加數字 ,那麽replace將 138 //用 “指定的子表達式相匹配的文本”來替換這兩個字符 139 //如:用中文半角引號替換英文半角引號,同時保持引號中內容不變(存儲在$1中) 140 str=‘\‘Javascript\‘:javascript:JavaScript:javaScript‘; 141 console.log(str.match(/‘([^"]*)‘/g)); 142 console.log(str.replace(/"([^"]*)"/g,‘“$1”‘)); 143 //解析:/"([^"‘]*)"/g 匹配字符串 "Javascript" ,“指定的子表達式相匹配的文本”(此處指第一個括號匹配的文本)匹配字符串 Javascript 144 //將該字符串(JavaScript)替換 $1 這兩個字符,得到 “$1” ---> “JavaScript” 145 146 //第二個參數時函數的情況: 147 function replacer(match, p1, p2, p3, offset, string) { 148 console.log(match);// 匹配到字符串 abc12345#$*% 149 console.log(offset);// 匹配到的子字符串在原字符串中的偏移量 3 150 console.log(string);// 原字符串 123abc12345#$*%A 151 console.log(p1,p2,p3);// p1、p2、p3 的值 abc 12345 #$*% 152 return [p1, p2, p3].join(‘ - ‘);// 返回值 abc - 12345 - #$*% 153 } 154 var newString = ‘123abc12345#$*%A‘.replace(/([^\d]{1,})(\d*)([^\w]*)/, replacer); 155 console.log(newString); // 123abc - 12345 - #$*%A 156 //解析:replacer 返回一個新的替換後的字符串,該方法並不改變調用它的字符串本身 157 //即將 123abc12345#$*%A 想要替換的部分(abc12345#$*%) 替換成 abc - 12345 - #$*% 158 //即 (括號內容將要被替換)(123abc12345#$*%)A ---> (括號內容已經被替換)(123abc - 12345 - #$*%)A 159 160 161 //match()唯一的參數是正則,返回一個數組Array,Array[0]存放完整的匹配 162 //Array[1]存放與第一個用圓括號括起來的表達式相匹配的子串,以此類推 163 //為了與replace()保持一致,Array[n]存放的是$n的內容 164 str="Visit my blog at http://www.example.com/~guang"; 165 var result=str.match(/(\w+):\/\/([\w.]+)\/(\S*)/); 166 console.log(result[0],result[1],result[2],result[3]);//http://www.example.com/~guang http www.example.com ~guang 167 168 169 //split()指定分隔符 170 str="1,2 ,3, 4 , 5"; 171 console.log(str.split(/\s*,\s*/));//輸出:[ ‘1‘, ‘2‘, ‘3‘, ‘4‘, ‘5‘ ] 172 173 174 /** 175 * RegExp()構造函數 有5個屬性 176 * 只讀屬性: 177 * source 包含正則表達式的文本 178 * global(ignoreCase)(multiline) 用以說明正則是否帶修飾符g(i)(m) 179 * 可讀寫屬性: 180 * lastIndex(這個屬性會被exec()和test()方法用到) 181 * 方法: exec()、test() 182 */ 183 184 //利用RegExp()構造函數創建正則表達式,使用"\"作為專業字符的前綴,因此使用"\"必須替換成"\\" 185 //參數一:正則主體(即//中間的文本),參數二:可選修飾符(i/g/m) 186 //構造函數可用於動態創建正則表達式,如用戶輸入 187 var re=new RegExp("\\d{5}","g"); 188 console.log("123456gww 4321 fjf87654".match(re));//輸出:["12345", "87654"] 189 console.log(re.source,re.global,re.ignoreCase,re.multiline,re.lastIndex);// 輸出:\d{5} true false false 0 190 191 192 //exec()參數是一個字符串,找到則返回一個數組,否則返回null 193 //與match()不同之處在於,exec()不管有無修飾符g"總是返回一個匹配結果" 194 //當它具有修飾符g時,它的lastIndex屬性就為緊挨著匹配子串的字符位置, 195 //當"同一個"正則表達式第二次調用exec()時,則從lastIndex處開始檢索, 196 //找出所有匹配之後lastIndex會自動重置為0 197 //當它不使用全局修飾符g時,每次開始檢索時lastIndex都設置為0 198 199 str="Who think JavaScript is more fun than Java!"; 200 pattern_no_g=/Java/; 201 pattern_carry_g=/Java/g; 202 203 //不使用全局修飾符 204 /* 205 while((result=pattern_no_g.exec(str)) !=null){ 206 console.log("Matched ‘"+result[0]+"‘"+ 207 " at position "+result.index+"; next search " + 208 "begins at "+pattern_no_g.lastIndex); 209 } 210 */ 211 //While循環第一遍返回一個結果:Matched ‘Java‘ at position 10; next search begins at 0 212 //While循環第二遍返回一個結果:Matched ‘Java‘ at position 10; next search begins at 0 213 //...... 死循環 214 //While循環第N遍返回一個結果:Matched ‘Java‘ at position 10; next search begins at 0 215 216 //使用全局修飾符 217 while((result=pattern_carry_g.exec(str)) !=null){ 218 console.log("Matched ‘"+result[0]+"‘"+ 219 " at position "+result.index+"; next search " + 220 "begins at "+pattern_carry_g.lastIndex); 221 } 222 //While循環第一遍返回一個結果:Matched ‘Java‘ at position 10; next search begins at 14 223 //While循環第二遍返回一個結果:Matched ‘Java‘ at position 38; next search begins at 42 224 console.log(pattern_carry_g.lastIndex);//輸出:0,帶有全局修飾符g,找出所有匹配之後,lastIndex自動重置為0 225 226 //只匹配一次(不找出所有匹配) 227 if((result=pattern_carry_g.exec(str)) !=null){ 228 console.log("Matched ‘"+result[0]+"‘"+ 229 " at position "+result.index+"; next search " + 230 "begins at "+pattern_carry_g.lastIndex); 231 } 232 //if條件語句內輸出:Matched ‘Java‘ at position 10; next search begins at 14 233 console.log(pattern_carry_g.lastIndex);//輸出:14,沒有找出所有匹配,因此lastIndex不會自動重置為0 234 var otherStr="JavaScript is fun";//此時 pattern_carry_g.lastIndex 值為 14 235 if((result=pattern_carry_g.exec(otherStr)) !=null){ 236 console.log("Matched ‘"+result[0]+"‘"+ 237 " at position "+result.index+"; next search " + 238 "begins at "+pattern_carry_g.lastIndex); 239 } 240 //輸出:沒有輸出 241 //解析:pattern_carry_g.lastIndex 值為 14,此時檢索將從字符串othertext的othertext[14]開始 242 //因此匹配值為空 result=pattern_carry_g.exec(otherStr) 語句執行後 result 等於 null 243 //因此沒有進入if語句內執行,因此記得必要時應該手動將lastIndex置0 244 245 pattern_carry_g.lastIndex=0;//手動重置為0 246 if((result=pattern_carry_g.exec(otherStr)) !=null){ 247 console.log("Matched ‘"+result[0]+"‘"+ 248 " at position "+result.index+"; next search " + 249 "begins at "+pattern_carry_g.lastIndex); 250 } 251 //輸出:Matched ‘Java‘ at position 0; next search begins at 4 252 //解析:正則表達式將字符串從頭開始匹配,匹配成功 253 254 255 //test()參數是一個字符串,返回true/false,其lastIndex屬性與exec()類似 256 console.log((/hello/g).test("hello world!"));// true 257 console.log((/hello/g).test("world! world!"));// false 258 259 260 /** 261 * 常用例子 262 */ 263 待更新...
正則表達式及其使用例子