正则

正则

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)

你可能感兴趣的:(正则)