常用正则表达式知识点解读及判读有效数字、手机号邮箱正则表达式
1、正则仅仅就是用来处理字符串的:匹配、捕获 匹配:验证当前的字符串是否符合我们的规则(每一个正则都是一个规则) 2、正则的组成:元字符、修饰符 元字符: 特殊意义的元字符: d匹配一个0-9的数字相当于[0-9],和它相反的 量词: * 0到多个 ?在正则中的意义比较多 放在一个非量词元字符后面代表出现0-1次 例如/^d?$/出现0-9直接的数0到1次 放在一个量词元字符后面,取消捕获时候的贪婪性 /^d+?$/捕获的时候只是把第一个捕获的数字获取 "2015"--->2 ()的作用 {n}出现n次 普通元字符 任何字符在正则中除了以上有特殊意义的,其他的都是代表本身意思的普通元字符 修饰符: i:忽略字母的大小写 项目中经常使用的正则 1)判断是有效数字的正则 有效数字是指:正数、负数、零、小数 第一部分:可能出现加减或者没有 有效的正整数(包含0):/^[+]?(d|[1-9]d+)$/; 有效的负整数(包含0):/^-(d|[1-9]d+)$/; 判断手机号(简单版): 判断邮箱 判断年龄在18到65之间的 真实有效的中华人民共和国姓名 2-4 位汉字 身份证号码 简单版 var reg = /^d{17}(d|X)$/; 复杂版 var reg = /^(d{2})(d{4})(d{4})(d{2})(d{2})(?:d{2})(d)(?:d|X)$/; 细节知识点 里面出现的任何字符都是代表本身意义的,例如:[.]中的”.“就是代表一个小数点而不是除了n以外的任意字符 1、exec正则的捕获方法--->先匹配,然后把匹配的内容捕获 如果字符串没有匹配这个正则,捕获的返结果是null 如果和正则匹配,返回的结果是一个数组 例子 第一项是我们捕获的内容 index:捕获的内容在元字符串中开始的索引位置 2、正则的捕获是懒惰的 正则的每一次捕获都从lastIndex值开始,第一次捕获的时候,lastIndex=0,从原始字符串索引为0的位置开始查找捕获,而默认的情况下,第一次捕获完成,lastIndex的值并没有发生改变,还是0,所以第二次捕获还是从原始字符串索引为0处开始查找,这样找到的还是第一次捕获的内容 var str = "zhufeng2015peixun2016"; var reg = /d+/g; 例子 为了防止没有加全局修饰符g导致的死循环,我们在处理之前,对于没有添加g的手动给添加一个g RegExp.prototype.myExecAll = function myExecAll() { var _this = this,str = arguments[0],ary = [],res = null; !_this.global ? _this = eval(_this.toString() + "g") : null; res = _this.exec(str); while (res) { ary[ary.length] = res[0]; res = _this.exec(str); } return ary; }; var ary = reg.myExecAll(str); console.log(ary); console.log(reg.lastIndex);//->0 var res = reg.exec(str); console.log(res); console.log(reg.lastIndex);//->11 res = reg.exec(str); console.log(res); console.log(reg.lastIndex);//->21 res = reg.exec(str); console.log(res);//->null 3、match:捕获字符串中存在一个叫做match的方法也可以实现捕获,而且只要我们取消了正则的懒惰性,执行一次match方法就可以捕获到所有内容了 var str = "zhufeng2015peixun2016"; var reg = /d+/g; console.log(str.match(reg)); 疑问:那我们都用match来替换exec多好啊? 4、正则的分组捕获 每一次捕获的时候,不仅仅可以把大正则匹配的内容捕获到,而且还可以把每一个小分组(子正则)匹配的内容单独的捕获到 var str = "zhufeng[2015]peixun[2016]"; var reg = /[(d)(d+)]/g; var res = reg.exec(str); console.log(res); ["[2015]","2","015",index: 7,input: "zhufeng[2015]peixun[2016]"] 第一项是大正则捕获的内容 res[0] 分组的只匹配不捕获:我们如果执行把分组内容进行匹配但是不进行捕获的话,只需要在分组的前面加上?:即可 var str = "zhufeng[2015]peixun[2016]"; var reg = /[(?:d)(d+)]/g; var res = reg.exec(str); console.log(res); ["[2015]","015"...] 数组中的第一项是大正则捕获的内容 res[0] 5、exec和match的区别 match只能捕获大正则匹配的内容,对于分组捕获中,是无法获取分组匹配的内容的,所以如果捕获的时候不需要捕获分组的内容,我们直接用match更方便,如果需要捕获分组的内容,我们只能使用exec来一个个捕获 var str = "zhufeng[2015]peixun[2016]"; var reg = /[(d+)]/g; //console.log(str.match(reg));//->["[2015]","[2016]"] var ary = []; var res = reg.exec(str); while (res) { //ary.push(res[1]); ary.push(RegExp.$1);//RegExp.$1获取当前正则第一个分组捕获的内容,(可能在部分IE浏览器下捕获不到值) res = reg.exec(str); } console.log(ary); 6、正则的贪婪性:在每一次的捕获的时候,总是按照正则匹配的最长结果捕获 var str = "zhufeng2015peixun2016"; var reg = /d+/g; console.log(reg.myExecAll(str));//-->["2015","2016"] var str = "zhufeng2015peixun2016"; var reg = /d+?/g; console.log(reg.myExecAll(str));//-->["2","0","1","5","6"] 7、分组引用 2代表出现和第二个分组一模一样的内容 1代表出现和第一个分组一模一样的内容 var reg=/^(w)(w)21$/; "woow"、"1221"... 8、字符串方法---->replace:把一个字符串中的某个字符替换成新的内容 1)在不使用正则的情况下 执行一次replace只能替换字符串中的一个,需要替换多个同样需要执行多次 var str = "zhufeng2015 zhufeng2016"; "zhufeng" -> "珠峰" str = str.replace("zhufeng","珠峰").replace("zhufeng","珠峰"); 有些时候即使执行多次,也实现不了替换 "zhufeng" -> "zhufengpeixun" str = str.replace("zhufeng","zhufengpeixun").replace("zhufeng","zhufengpeixun"); [第一个参数可以是一个正则] 把所有和正则匹配的内容进行替换(但是和捕获一样默认是懒惰的,只有加上全局修饰符g才可以) var str = "zhufeng2015 zhufeng2016"; str = str.replace(/zhufeng/g,"zhufengpeixun"); console.log(str); 1)执行和执行次数问题 其实和exec捕获的原理是一模一样的 例如:我们第二个参数如果传递的是一个函数,每当正则在字符串中捕获一次当前的这个函数就执行一次 ->本题中一共捕获了两次,所以函数执行了两次 var str = "zhufeng2015 zhufeng2016"; str = str.replace(/zhufeng/g,function () { 2)参数问题 console.dir(arguments); 3)返回值问题 return返回的是什么,就相当于把当前捕获的内容替换成什么 return "zhufengpeixun"; }); console.log(str); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 如何在Oracle查询中禁用PL / SQL
- easyui+rest服务,ajax请求session过期不跳转问题
- 如何从C#中的byte []创建一个bmp文件
- swift – sectionInset不使用AutoLayout在iOS8中
- Ajax Post数据时加号变空格的解决办法
- 利用ajaxFileupload实现表单和图片同时上传
- cocos2d-x CCControlPotentiometer 圆形音量按钮
- ruby-on-rails – 应该如何链接json响应,以便Act
- ruby – 在脚本中安装宝石后,如何加载宝石?
- Distributed Algorithms in NoSQL Databases