正则
1.什么是正则:用来操作字符串的规则;
正则就是用来操作(校验,捕获)“字符串”的
1)校验:返回布尔值 true:符合规则 false:不合格;
2)捕获:把符合规则内容拎出来;
正则表达式:元字符 修饰符
var re=/\d+/g;
两个斜杠之间的都是元字符;
斜杠外面的是修饰符;
3.元字符包含:代表特殊含义的元字符+代表次数的量词元字符
1)代表特殊含义的元字符
\转义
|或
()小分组
. 除了\n以外的其他字符
\n 换行
\b 开头结尾和空格 匹配一个边界
^开头
$结尾
\s 空格; \S 非空格
\d 数字; \D 非数子
\w 数字字母下划线; \W 非数字字母下划线
x|y匹配x或者y中的任意一个
[a-z]字母 匹配a-z种的任意字符
[^a-z] 非字母
[abc]abc三者中的任何一个;
[^abc]除了abc三者中的任何一个;
2)代表次数的量词元字符
* 0到多
+ 1次或者多次
? 0||1次 0次或1次
{n} 正好n次
{n,} n到多
{n,m} n次到m次
4.修饰符;
g 全局 (global)
i 忽略大小写 (ignoreCase)
m 换行 (mulitiline)
分组【】 ()
5.什么时候加开头和结尾:
如果从一段字符串中,查找是否包含某个小字符-不要加开头和结尾
严格匹配,必须加开头和结尾;
6.中括号[]的用法:
1)中括号中放的类似于+,.等特殊符号都没有特殊含义;
2)中括号中不会出现两位数
7:()分组的作用:
- 可以改变正则处理时候的优先级
- 分组捕获:分组其实可以理解为大正则中分出一个小正则,在正则捕获的时候,我们不仅仅可以把大正则匹配的结果捕获到,也可以把小分组匹配的结果捕获到
- 分组引用:出现和前面分组一模一样的结果
- \1 出现第一个和分组一模一样的内容,但是保证当前引用的分组,能够捕获到(不能加?: ?= ?!)
8.当/^$/中遇到|的时候;最好用()提高优先级; reg=/^(18|19)$/;
教验
教验
1;test()校验,因为他返回的是布尔值,所以一般用于if条件判断种,验证某一个字符串是否符合某一规则
2;exec:用来正则捕获的,可以返回一个数组,在没有小分组的情况下,数组有三项:
1)符合大正则的内容,捕获的内容
2)index:index捕获开始的索引
3)input:input是原始数组
3.正则捕获量大特性:exec
1)懒惰型:每调用一次,exec,lastIndex永远都是从0的位置开始查找
- 执行一次exec只能捕获一次,为了解决他的懒惰性,我们可以添加全局g就能解决了
- lastIndex 正则捕获的起始位置
- 第一次捕获的时候,值为0,在正则不做任何处理的情况下,我们下次捕获的时候,這个值依然是0,所以会重复捕获第一个内容
- 解决措施:添加全局g
2) 贪婪性:如果用了加号,永远拿到的是最长的值,
解决措施在+? 这样每次只能拿到一个值
4. exec和match的区别:
- macth必须要加上g,否则只捕获第一个
- match只能捕获到所有符合大正则的内容,无法拿到小分组的信息;
- 在正则没有全局g的情况下,exec和match都只会捕获1次;都能拿到小分组的信息;
- 有全局g的情况下,exec仍然能拿到小分组信息,
5. reg.replace()两个参数,参1;字符串/正则 参2;字符串 匿名函数
- 在這个匿名函数种,接受的参数,跟exec拿到的值一模一样
- 匿名函数被调用的次数,取决于前面正则匹配成功的次数
- 匿名函数中的argument[0],argument[1],第一个是获取到的大正则 第二个参数是小分组
- 在函数中,你返回的是什么,就相当于把reg正则里面的内容替换成了什么,不写return 默认返回undefined
6. macth 字符串的方法,捕获到正则匹配的结果,只要加了分组,捕获的时候,不仅把大正则捕获到,而且里面的每一个小分组,匹配的时候,也可以捕获到,如果其中某一个分组,不需要捕获,我们可以在分组的前面加上?: 只匹配不捕获
7; 1)?可有可无;
2)(?;)只匹配不捕获
3)+?解决正则的贪婪性 放在一个量词元字符后面,代表取消正则捕获时候的贪婪性
4)?=正向预查 匹配不捕获
5)?!负向预查 不需要那个 (?!3)不能出现3 匹配不捕获
6) ? 0||1次 0次或1次 在普通的元字符后面,代表出现0-1次
8;()用法;
1)在正则中,有/^(18|19)$/,加()提高优先级
2)分组的作用
3)只匹配不捕获
4)从左往右数( 从他开始数小分组
9;谁能影响lastIndex 的值
test+g
exec+g
以上两个都必须配合g,才能实现lastIndex值的增加;
正则例子
1)手机号正则 /^1\d{10}$/
2)有效数字正则 /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
3)验证年龄 18-65 /^((18|19)|([2-5]\d)|(6[0-5]))$/;
4)验证邮箱的正则 /^([\w.-]+)@([0-9a-zA-Z]+)(\.[a-zA-Z]{2,4}){1,2}$/
5)中文名字 /^[\u4e00-\u9fa5]{2,4}$/
6)身份证号
var reg = /^\d{17}(\d|X)$/;
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/;
7)非空验证 !/^\s*$/
8)去除首尾空格 /(^ +)|( +$)/g
9)偷小说 /<[^<>]>/g; 注意:textarea 千万不要通过innerHTML取值,因为你拿不到,只能通过value才能内容; var reg=/<[^<>]+>/g
10)去除收尾空格
var reg=/(^ +)|( +$)/g;
var reg=/(^ +| +$)/g;
var reg=/(^\s+|\s+$)/g;
//去除字符串中所有的空格;
var reg=/\s+/g;
11)var reg=/^([a-z])$/
12)百度昵称英文14位,汉字七个
function chekNick(nick) {
var reg1=/^[\u4e00-\u9fa5]$/ //检测是否为中文
var reg2=/^\w$/; //检测是否为 数字 字母 下划线
var len=0;
for (var i=0;i
var cur=nick[i];
if (reg1.test(cur)){
len+=2
}else if(reg2.test(cur)) {
len++;
}else {
len=0;
break;
}
}
if (len==0||len>14){
return false;
}
return true;
}
13)密码 数字或字母组合在一起的(6-10)位
var reg=/^(?![0-9]+$)(?![a-zA-Z]+$)[a-zA-Z0-9]{6,10}$/
14) 出现一个数字,但是不能是3,然后這个机制可以出现多次
var reg=/^((?!3)\d)+$/;
myExecAll
RegExp.prototype.myExecAll=function () {
var str=arguments[0]||'';//如果第一个参数值没有传递的话,我们默认为空字符串
//正则加g才能捕获全部,没有加的话,我们只让其捕获第一个即可 this是reg g=global
if (!this.global){
return this.exec(str)
}
var ary=[]
var resZs=this.exec(str)
while (resZs){
ary.push(resZs[0])
resZs=this.exec(str)
}
return ary.length===0?null:ary
}
reg.myExecAll(str)
myMatch
String.prototype.myMatch=function(reg){
//this:字符串实例
var res=reg.exec(this);
var ary=[];
while(res){
ary.push(res[0]);
res=reg.exec(this);
}
return ary;
}
var ary=str.myMatch(reg);
console.log(ary);
回调函数
11.回调函数注意4点:
1)什么时候被调用?调用次数?
2)是否传参
3)是否改变this指向
4)是否有返回值;
//ForEach在浏览器下不兼容,我们写這个方法让他在浏览器下兼容
var ary=[12,14,19,33,22]
var obj={}
Array.prototype.myForEach=function (cb,context) {
//context代表的是this
context=context||window
//浏览器兼容,就直接使用浏览器兼容的方法
if ('forEach'in Array.prototype){
this.forEach(cb,context);
return;//阻断代码
}
//当浏览器不支持的时候,自己写兼容方法
for(var i=0;i
cb.call(context,this[i],i,this)
//改变this指向
}
}
//调用封装的myForEach這个方法
var res=ary.myForEach(function (item,index,input) {
console.log(item,index,input)
})
console.log(res)