正则表达式的概念:我们在处理数据的时候,经常会有查找符合某些复杂规则的字符串的需要。正则表达式就是用于描述这些规则的语法。
正则表达式的主要作用是分割、匹配、查找、替换。
正则表达式不仅可以帮助我们完成一些通过函数无法实现的工作,还可以帮助我们减轻很多工作量。
正则表达式的定义方法:方式一:/规则/匹配成功返回TRUE ,
方式二:new RegExp(字符串);
1 var str = "一统大业123满城风絮456"; 2 3 4 var r = /123/; 5 6 var reg = new RegExp("123"); 7 8 alert(r.test(str)) //弹窗为TRUE 9 //alert(reg.test(str))
为转译符号
特殊字符:
特殊字符 * * * * d 数字 * D 非数字 * s 空格 * S 非空格 * w 字符(数字、字母、_) * W 非字符(不是w的都是匹配内容) * * 单词边界 起始 结束 连词符(除了w 其他的都属于连词符) (独立的部分) * B 非独立部分
量词:满足匹配规则字符的数量。reg=/1{1,5}/匹配最少1次最多5次,如果有5次则匹配5次。默认为贪婪匹配
有几种特殊写法
* {0,1} ? 最少0次 最多1次
* {1,} + 最少1次 最多无限
* {0,} * 不限制,可以任意次
贪婪匹配和非贪婪匹配
* 贪婪匹配会先以最多的次数来进行匹配
* 例如:
* "11111222333".replace(/1{4,6}?/,"A")
输出:"A222333"
非贪婪匹配
写法 量词? {}?
以量词里最少次数开始匹配
范围词【】:
1 var str = "aAbBcC"; 2 var reg = /[A-Z]/g; 3 console.log(str.match(reg))
标识符:
* g global 全局
* i ignore case 不区分大小写
* m multiline 换行匹配
*
* 写在第二个/后面
子集:
1 /* 2 * 3 * () 4 * 子集 一个整体 5 * 6 * {}如果量词前面不是子集那么只管前面一个字符 7 * 8 * */ 9 10 11 var str = "12121212"; 12 13 var reg = /(12){2,5}/g; 14 15 16 console.log(str.match(reg))
str.match()的使用:返回一个数组,包含着匹配内容的一个数组,如果匹配不成功就是返回null,返回的是null,而不是空数组。
ps:Array.isArray(检测对象)判断一个对象是不是数组是 返回 true不是 返回 false
1 var reg = /222/; 2 3 4 var str = "方当111"; 5 6 var arr = str.match(reg); 7 8 9 console.log(arr); 10 11 12 alert(Array.isArray(arr));
回顾:
1 回顾: 2 * 3 * 特殊字符 4 * / {} () [] + ? * {}? +? *? ?? | 5 * 6 * 7 * 元字符 8 * d 数字 9 * w 字符(字母,数字,_) 10 * s 空格 11 * 单词边界 独立部分 连词符(除了w以外的都是) 12 * 13 * 给上面对应的取反 14 * D 15 * W 16 * S 17 * B 18 * 19 * 标识 20 * g 全局 21 * m 换行匹配 22 * i 不区分大小写 23 * 24 * 25 * str.match(reg) 26 * 把正则匹配的内容,返回一个新的数组 27 * 28 * 29 * reg.test(str) 30 * 在str去匹配reg的规则,有则返回 true 没有就返回false 31 * 32 * str.replace(reg,str2(function)) 33 * 第二个参数如果是str 34 * 则把正则匹配的部分替换为str2
replace:
1 replace() 除了可以是字符串,还可以是function 2 * 3 * 正则没有子集的时候: 4 * 第二个参数是函数的函数的时候 5 * 函数的第一个形参 6 * 正则匹配到的内容 7 * 第二个形参: 8 * 是每次匹配到的结果对应的索引 9 * 第三个形参: 10 * 是正则匹配的目标str本身 11 * 12 * 13 * 14 * 如果正则里有子集的时候: 15 * 函数的第一个参数: 16 * 是正则每次匹配到的内容 17 * 第二个参数 18 * 对应第一个子集 19 * 第三个 20 * 对应第二个子集 21 * 以此类推 22 * 23 * 最后一个参数 24 * 是每次匹配的内容在目标字符串里的下标
1 var str = "A1A1A1A1"; 2 3 var reg = /(A1)/g; 4 5 var a = str.replace(reg,function (a,b,c) { 6 console.log(b); 7 console.log(c); 8 return a+"X"; 9 10 }); 11 12 13 console.log(a) 14 console.log(str)
案例:
1.用正则过滤脏字:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="Author" content="FengYu"> <title>Tz-34期Js</title> <style> *{margin:0;padding:0;font-family: Microsoft YaHei,serif;} li{list-style: none;} .time{ display: block; color:#999; } </style> <script src="https://git.oschina.net/cx-fy/personal/raw/master/conmenu.js"></script> </head> <body> <input type="text" id="input"> <input type="button" id="btn" value="发送"> <ul> <!--<li><span class="time">22:00</span><span class="txt">傻逼</span></li>--> </ul> <script> var inp1 = document.getElementById("input"), btn = document.getElementById("btn"), oUl = document.getElementsByTagName("ul")[0], reg = /傻.{0,3}逼/; btn.onclick=function () { var val = inp1.value; if(val){ val = val.replace(reg,function (a) { var str = ""; for(var i=0,length=a.length;i<length;i++){ str += "*"; } return str; }); var data = new Date(), //获取时分秒 hh = data.getHours(), mm = data.getMinutes(), ss = data.getSeconds(); //给时分秒加上0 hh = addZero(hh); mm = addZero(mm); ss = addZero(ss); var timer = hh+":"+mm+":"+ss; var oLi = document.createElement("li"); oLi.innerHTML = '<span class="time">'+timer+'</span><span class="txt">'+val+'</span>' oUl.appendChild(oLi); inp1.value = ""; } }; function addZero(n) { return n<10?"0"+n:n+""; } </script> </body> </html>
2.商用正则表达式:
1 var reg = { 2 qq : /^[1-9]d{4,9}$/, //匹配qq号 3 pwd : /^[w!@#$%^&*[](){}\/-.]{6,20}$/, //密码 4 user : /^[a-zA-Z_]w{5,17}$/, //用户名 5 email : /^[1-9a-zA-Z]w{5,17}@[1-9a-z]{2,7}.[a-z]{2,4}$/, //电子邮箱 6 tel : /^1[3-8]d{9}$/, //手机号 7 idCard : /^[1-9]d{5}[12][90]d{2}[01]d[0-3]dd{3}[dxX]$/, //身份证 8 url : /^(http|https)://[^@S]*$/ //网址 9 }; 10 11 var str = "http://www.baidu.com/@"; 12 alert(reg.url.test(str))