1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" 6 content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> 7 <meta http-equiv="X-UA-Compatible" content="ie=edge"> 8 <title>14正则表达式</title> 9 </head> 10 <body> 11 12 <script> 13 /* 说明: 14 (1) 元字符(表示符号: 规定的字符)、原子表(表示符号: []),是正则表达式中的最小元素,只代表单一(一个)字符。 15 (2) 原子组(表示符号: ()),原子组与原子表的差别在于原子组一次匹配多个字符,而原子表则是匹配任意一个字符。 16 (3) 重复匹配: 因为正则最小单位是元字符,而我们很少只匹配一个元字符如 a、b 所以基本上重复匹配在每条正则语句中都是必用到的内容。 17 (4) 其它: [] 任意一个,() 整体,/ab/ 连续字符。 18 */ 19 20 /*14.1 选择符的使用*/ 21 // | 这个符号代表选择修释符,也就是 | 左右两侧有一个匹配到就可以。 22 23 /*14.1.1 检测电话是否是上海或北京的座机*/ 24 // let tel = "010-12345678"; 25 // //错误结果:只匹配 | 左右两边任一结果 26 // console.log(tel.match(/010|020\-\d{7,8}/)); // ['010', index: 0, input: '010-12345678', groups: undefined] 27 // //正确结果:所有需要放在原子组中使用 28 // console.log(tel.match(/(010|020)\-\d{7,8}/)); // (2)['010-12345678', '010', index: 0, input: '010-12345678', groups: undefined] 29 30 /*14.1.2 匹配字符是否包含baidu 或 biu*/ 31 // let web = "www.baidu.com"; 32 // console.log(/baidu|biu/.test(web)); //true 33 34 /*14.2 转义*/ 35 //含义1: . 除换行外任何字符 含义2: .普通点 36 //含义1: d 字母d 含义2: \d 数字 0~9 37 38 // let price = 12.23; 39 // console.log("\d+\.\d+"); // d+.d+ 40 // console.log("\\d+\\.\\d+"); // \d+\.\d+ 41 // let reg = new RegExp("\\d+\\.\\d+"); 42 // console.log(reg.test(price)); // true 43 // 44 // let url = "https://www.baidu.com"; 45 // console.log(/https?:\/\/\w+\.\w+\.\w+/.test(url)); // true 46 47 /*14.3 字符边界约束*/ 48 /* 49 使用字符边界符用于控制匹配内容的开始与结束约定。 50 边界符 说明 51 ^ 匹配字符串的开始 52 $ 匹配字符串的结束,忽略换行符 53 */ 54 55 // let name = "54321"; 56 // console.log(/^\d+$/.test(name)); // true 57 58 // let name = "54321"; 59 // console.log(name.match(/^\d+$/)); // ['54321', index: 0, input: '54321', groups: undefined] 60 61 // 以字母开头,数字结尾,并且整个长度为6-12的正则表达式 62 // /^[a-z]\d{5,11}$/ 63 64 /*14.4 元字符*/ 65 // 元字符是正则表达式中的最小元素,只代表单一(一个)字符 66 /* 67 元字符 说明 示例 68 \d 匹配任意一个数字 [0-9] 69 \D 与除了数字以外的任何一个字符匹配 [^0-9] 70 \w 与任意一个英文字母,数字或下划线匹配 [a-zA-Z_] 71 \W 除了字母,数字或下划线外与任何字符匹配 [^a-za-z_] 72 \s 任意一个空白字符匹配,如空格,制表符\t,换行符\n [\n\f\r\t\v] 73 \S 除了空白符外任意一个字符匹配 [^\n\f\r\t\v] 74 . 匹配除换行符外的任意字符 75 */ 76 77 /*14.4.1 \d */ 78 // let web = "www.baidu.com 2022"; 79 // console.log(web.match(/\d/)); // ['2', index: 14, input: 'www.baidu.com 2022', groups: undefined] 80 // console.log(web.match(/\d/g)); // (4)['2', '0', '2', '2'] 81 // console.log(web.match(/\d+/)); // ['2022', index: 14, input: 'www.baidu.com 2022', groups: undefined] 82 83 // let name = "张三:010-99999999,李四:020-88888888"; 84 // console.log(name.match(/\d{3}-\d{7,8}/g)); // (2)['010-99999999', '020-88888888'] 85 86 /*14.4.2 \D */ 87 // let name = "www.baidu.com 2022 hello"; 88 // console.log(name.match(/\D/)); // ['w', index: 0, input: 'www.baidu.com 2022 hello', groups: undefined] 89 // console.log(name.match(/\D+/)); // ['www.baidu.com ', index: 0, input: 'www.baidu.com 2022 hello', groups: undefined] 90 // console.log(name.match(/\D+/g)); // (2)['www.baidu.com ', ' hello'] 91 92 /*14.4.3 \w */ 93 // let web = "baidu.com2022-@@2023"; 94 // console.log(web.match(/\w/)); // ['b', index: 0, input: 'baidu.com2022-@@2023', groups: undefined] 95 // console.log(web.match(/\w+/)); // ['baidu', index: 0, input: 'baidu.com2022-@@2023', groups: undefined] 96 // console.log(web.match(/\w+/g)); // (3)['baidu', 'com2022', '2023'] 97 98 /*14.4.4 \W */ 99 // console.log("baidu.com@".match(/\W+/g)); // ['.', '@'] 100 101 /*14.4.5 \s */ 102 // console.log(/\s/.test("web\n")); // true 103 104 /*14.4.6 \S */ 105 // console.log(/\S/.test("web\n")); // true 106 107 /*14.4.7 . */ 108 // let web = "www.badiu.com @ 2022"; 109 // console.log(web.match(/./)); // ['w', index: 0, input: 'www.badiu.com @ 2022', groups: undefined] 110 // console.log(web.match(/.+/)); // ['www.badiu.com @ 2022', index: 0, input: 'www.badiu.com @ 2022', groups: undefined] 111 // console.log(web.match(/.+/g)); // ['www.badiu.com @ 2022'] 112 113 // let name = ` 114 // baidu.com 115 // sina.com 116 // `; 117 // console.log(name.match(/.+/sg)); // ['\n baidu.com\n sina.com\n '] 118 119 /*14.5 匹配所有字符 */ 120 // 可以使用 [\s\S] 或 [\d\D] 来匹配所有字符 121 // let web = "baidu.com_@2022 123 #% bv" 122 // console.log(web.match(/[\s\S]+/)); // ['baidu.com_@2022 123 #% bv', index: 0, input: 'baidu.com_@2022 123 #% bv', groups: undefined] 123 124 // let web = "bai\ndu.com_@2022 12\n3 #% bv" 125 // console.log(web.match(/[\s\S]+/g)); // ['bai\ndu.com_@2022 12\n3 #% bv'] 126 127 /*14.6 模式修正符*/ 128 /* 129 正则表达式在执行时会按他们的默认执行方式进行,但有时候默认的处理方式总不能满足我们的需求,所以可以使用模式修正符更改默认方式。 130 修饰符 说明 131 i 不区分大小写字母的匹配 132 g 全局搜索所有匹配内容 133 m 视为多行 134 s 视为单行忽略换行符,使用 . 可以匹配所有字符 135 y 从 regexp.lastIndex 开始匹配 136 u 正确处理四个字符的 UTF-16 编码 137 */ 138 139 /*14.6.1 i与g模式修正符*/ 140 // let name = "BaiBaiDu"; 141 // console.log(name.match(/b/)); // null 142 // console.log(name.match(/b/i)); // ['B', index: 0, input: 'BaiBaiDu', groups: undefined] 143 // console.log(name.match(/b/ig)); // (2)['B', 'B'] 144 145 /*14.6.2 lastIndex属性*/ 146 // 控制正则表达式开始搜索的位置 147 // let name = "baidu"; 148 // console.log(name.match(/\w/g)); // (5)['b', 'a', 'i', 'd', 'u'] 149 // let reg = /\w/g; 150 // console.log(reg.lastIndex); // 0 151 // console.log(reg.exec(name)); // ['b', index: 0, input: 'baidu', groups: undefined] 152 // console.log(reg.lastIndex); // 1 153 // console.log(reg.exec(name)); // ['a', index: 1, input: 'baidu', groups: undefined] 154 155 /*14.7 原子表基本使用*/ 156 /* 157 在一组字符中匹配某个元字符,在正则表达式中通过元字符表来完成,就是放到[] (方括号)中。 158 159 原子表 说明 160 [] 只匹配其中的一个原子 161 [^] 只匹配"除了"其中字符的任意一个原子 162 [0-9] 匹配 0-9 任何一个数字 163 [a-z] 匹配小写 a-z 任何一个字母 164 [A-Z] 匹配大写 A-Z 任何一个字母 165 */ 166 167 /*14.7.1 [] */ 168 // let name = "BaiduBaidu"; 169 // // 整个匹配 170 // console.log(name.match(/ai/)); // ['ai', index: 1, input: 'BaiduBaidu', groups: undefined] 171 // // []只匹配其中的一个 172 // console.log(name.match(/[ai]/)); // ['a', index: 1, input: 'BaiduBaidu', groups: undefined] 173 // console.log(name.match(/[ai]+/)); // ['ai', index: 1, input: 'BaiduBaidu', groups: undefined] 174 // console.log(name.match(/[ai]+/g)); // (2)['ai', 'ai'] 175 176 // let web1 = "2022@2023"; 177 // console.log(web1.match(/[0-9]/)); // ['2', index: 0, input: '2022@2023', groups: undefined] 178 // console.log(web1.match(/[0-9]+/)); // ['2022', index: 0, input: '2022@2023', groups: undefined] 179 // console.log(web1.match(/[0-9]+/g)); // (2)['2022', '2023'] 180 181 // let tel = "2022-09-22"; 182 // let reg = /^\d{4}([-\/])\d{2}\1\d{2}$/; 183 // console.log(tel.match(reg)); // (2)['2022-09-22', '-', index: 0, input: '2022-09-22', groups: undefined] 184 185 /*14.7.2 区间匹配*/ 186 // // 数字区间 187 // let name = "2022"; 188 // console.log(name.match(/[0-9]+/)); // ['2022', index: 0, input: '2022', groups: undefined] 189 // // 字母匹配 190 // let web = "baidu"; 191 // console.log(web.match(/[a-z]+/)); // ['baidu', index: 0, input: 'baidu', groups: undefined] 192 193 /*14.7.3 排除匹配*/ 194 // let name = "baidu"; 195 // console.log(name.match(/[^i]/)); // ['b', index: 0, input: 'baidu', groups: undefined] 196 // console.log(name.match(/[^i]+/)); // ['ba', index: 0, input: 'baidu', groups: undefined] 197 // console.log(name.match(/[^i]+/g)); // (2)['ba', 'du'] 198 199 // 匹配中文 200 // let name = "张三:010-99999999,李四:010-88888888"; 201 // console.log(name.match(/[^:\d-,]+/g)); // (2)['张三', '李四'] 202 203 /*14.7.4 原子表字符不解析*/ 204 // let name = "(baidu).+"; 205 // console.log(name.match(/[()]/g)); // (2)['(', ')'] 206 // console.log(name.match(/[.+]+/)); // ['.+', index: 7, input: '(baidu).+', groups: undefined] 207 208 /*14.7.5 使用原子表匹配所有内容*/ 209 // let name = ` 210 // baidu 211 // sina 212 // `; 213 // console.log(name.match(/.+/g)); // (3)[' baidu', ' sina', ' '] 214 // // 所有内容 [\s\S] 等价于 [\d\D] 215 // console.log(name.match(/[\s\S]+/)); // ['\n baidu\n sina\n ', index: 0, input: '\n baidu\n sina\n ', groups: undefined] 216 // console.log(name.match(/[\d\D]+/)); // ['\n baidu\n sina\n ', index: 0, input: '\n baidu\n sina\n ', groups: undefined] 217 218 /*14.8 原子组*/ 219 /* 220 (1) 如果一次要匹配多个字符,可以通过原子组完成。 221 (2) 原子组与原子表的差别在于原子组一次匹配多个字符,而原子表则是匹配任意一个字符。 222 (3) 原子组用 () 包裹。 223 (4) 基本使用 224 没有添加 g 模式修正符时只匹配到第一个,匹配到的信息包含以下数据。 225 变量 说明 226 0 匹配到的完整内容 227 1,2.... 匹配到的原子组 228 index 原字符串中的位置 229 input 原字符串 230 groups 命名分组 231 在match中使用原子组匹配,会将每个组数据返回到结果中。 232 */ 233 234 /*14.8.1 原子组及原子组别名示例*/ 235 // let name = ` 236 // <h1> 237 // baidu 238 // </h1> 239 // <h2>sina</h2> 240 // `; 241 // let reg = /<(h[1-6])>[\s\S]*<\/\1>/gi; 242 // console.log(name.match(reg)[1]); // <h2>sina</h2> 243 // console.log(name.match(reg)); // (2)['<h1>\n baidu\n </h1>', '<h2>sina</h2>'] 244 // 245 // // 去除全局匹配g,原子组别名 246 // let reg1 = /<(?<con>h[1-6])>[\s\S]*<\/\1>/i; 247 // console.log(name.match(reg1)); 248 // /* 249 // 0: "<h1>\n baidu\n </h1>" 250 // 1: "h1" 251 // groups: {con: 'h1'} 252 // index: 5 253 // input: "\n <h1>\n baidu\n </h1>\n <h2>sina</h2>\n " 254 // length: 2 255 // */ 256 // console.log(name.match(reg1).groups); // {con: 'h1'} 257 258 /*14.8.2 原子组引用完成替换操作*/ 259 // let name = ` 260 // <h1> 261 // baidu 262 // </h1> 263 // <h2>sina</h2> 264 // `; 265 // let reg = /<(h[1-6])>([\s\S]*)<\/\1>/gi; 266 // console.log(name.replace(reg,`<p>$2</p>`)); 267 // /* 268 // <p> 269 // baidu 270 // </p> 271 // <p>sina</p> 272 // */ 273 // 274 // // 通过原子组别名的方式替换 275 // let reg1 = /<(h[1-6])>(?<con>[\s\S]*)<\/\1>/gi; 276 // console.log(name.replace(reg1,`<p>$<con></p>`)); 277 // /* 278 // <p> 279 // baidu 280 // </p> 281 // <p>sina</p> 282 // */ 283 284 /*14.9 重复匹配*/ 285 /* 286 如果要重复匹配一些内容时我们要使用重复匹配修饰符,包括以下几种。 287 符号 说明 288 * 重复零次或更多次 289 + 重复一次或更多次 290 ? 重复零次或一次 291 {n} 重复 n 次 292 {n,} 重复 n 次或更多次 293 {n,m} 重复 n 到 m 次 294 因为正则最小单位是元字符,而我们很少只匹配一个元字符如 a、b 所以基本上重复匹配在每条正则语句中都是必用到的内容。 295 */ 296 297 /*14.9.1 + */ 298 // let name = "cdddddd"; 299 // console.log(name.match(/cd/)); // ['cd', index: 0, input: 'cdddddd', groups: undefined] 300 // console.log(name.match(/cd+/)); // ['cdddddd', index: 0, input: 'cdddddd', groups: undefined] 301 // 302 // let name1 = "cadddddd"; 303 // console.log(name1.match(/cd+/));// null 304 305 /*14.9.2 * */ 306 // let name = "cdddddd"; 307 // console.log(name.match(/cd*/)); // ['cdddddd', index: 0, input: 'cdddddd', groups: undefined] 308 // 309 // let name1 = "cadddddd"; 310 // console.log(name1.match(/cd*/)); // ['c', index: 0, input: 'cadddddd', groups: undefined] 311 312 /*14.9.3 {} */ 313 // let name = "cdddddd"; 314 // console.log(name.match(/cd{2}/)); // ['cdd', index: 0, input: 'cdddddd', groups: undefined] 315 // console.log(name.match(/cd{2,4}/)); // ['cdddd', index: 0, input: 'cdddddd', groups: undefined] 316 // console.log(name.match(/cd{2,}/)); // ['cdddddd', index: 0, input: 'cdddddd', groups: undefined] 317 318 // 匹配电话号码 319 // let tel = "010-99999999"; 320 // console.log(tel.match(/^0\d{2,3}-\d{7,8}$/)); // ['010-99999999', index: 0, input: '010-99999999', groups: undefined] 321 322 /*14.9.4 ? */ 323 // let name = "cdddddd"; 324 // console.log(name.match(/cd?/)) // ['cd', index: 0, input: 'cdddddd', groups: undefined] 325 // 326 // let name1 = "cadcddddd"; 327 // console.log(name1.match(/cd?/)); // ['c', index: 0, input: 'cadcddddd', groups: undefined] 328 329 /*14.9.5 重复匹配对原子组影响与电话号正则*/ 330 // let name = "cdddddd"; 331 // console.log(name.match(/cd+/)); // ['cdddddd', index: 0, input: 'cdddddd', groups: undefined] 332 // 333 // let name1 = "cdcdcdc"; 334 // console.log(name1.match(/(cd)+/)); // (2)['cdcdcd', 'cd', index: 0, input: 'cdcdcdc', groups: undefined] 335 336 /*14.10 汉字与字符属性*/ 337 // let info = "baidu,2022,全球最大的,中文搜索引擎。"; 338 // // 匹配字母属性 339 // console.log(info.match(/\p{L}+/gu)); // (3)['baidu', '全球最大的', '中文搜索引擎'] 340 // // 匹配标点符号属性 341 // console.log(info.match(/\p{P}+/gu)); // (4)[',', ',', ',', '。'] 342 // // 匹配汉字属性 343 // console.log(info.match(/\p{sc=Han}+/gu)); // (2)['全球最大的', '中文搜索引擎'] 344 345 </script> 346 </body> 347 </html>
标签:baidu,console,name,正则表达式,let,log,match,14 From: https://www.cnblogs.com/LiuChang-blog/p/16724174.html