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 待更新...
原文地址:https://www.cnblogs.com/go4it/p/9786943.html
时间: 2024-11-01 20:22:49