1、正则仅仅就是用来处理字符串的:匹配、捕获
匹配:验证当前的字符串是否符合我们的规则(每一个正则都是一个规则)
捕获:在整个字符串当中,把符合规则的字符都依次的获取到--->exec、match、replace
2、正则的组成:元字符、修饰符
元字符:
特殊意义的元字符:
\d匹配一个0-9的数字相当于[0-9],和它相反的
\D匹配一个除了0-9的任意字符相当于【】
\w匹配一个0-9、a-z、A-Z_ 的数字或字符,相当于[0-9a-zA-Z_] 、
\s匹配一个空白字符(空格、制表符。。。)
\b匹配一个单词的边界 “w100 w000”
\t匹配一个制表符
\n匹配一个换行
. 匹配一个除了\n以外的任意字符
^ 以某一个元字符开头
$ 以某一个元字符结尾
\ 转译字符
x|y x或者y的一个
[xyz] x、y、z、中的任意一个
[^xyz]除了x、y、z、中的任意一个
[a-z] -> 匹配a-z中的任意一个字符
[^a-z] -> 匹配除了a-z中的任意一个字符
() 正则中的分组
量词:
* 0到多个
+ 1到多个
? 0到1个
?在正则中的意义比较多
放在一个非量词元字符后面代表出现0-1次 例如/^\d?$/出现0-9直接的数0到1次
放在一个量词元字符后面,取消捕获时候的贪婪性 /^\d+?$/捕获的时候只是把第一个捕获的数字获取 "2015"--->2
(?:)分组值匹配不捕获
(?=)正向预查
(?!)负向预查
()的作用
1)改变默认的优先级
2)可以进行分组捕获
3)分组引用
{n}出现n次
{n,}出现n到多次
{n,m}出现n到m次
普通元字符
任何字符在正则中除了以上有特殊意义的,其他的都是代表本身意思的普通元字符
修饰符:
i:忽略字母的大小写
m:multiline 多行匹配
g:global全局匹配
项目中经常使用的正则
1)判断是有效数字的正则
有效数字是指:正数、负数、零、小数
第一部分:可能出现加减或者没有
第二部分:一位数可以是0,多位数不能以0开头
第三部分:可以有小数也可以没有小数,但是一旦出现小数点,后面至少跟一位数字
var reg =https://www.jb51.net/^[+-]?(\d|[1-9]\d+)(\.\d+)?$/;
有效的正整数(包含0):/^[+]?(\d|[1-9]\d+)$/;
有效的负整数(包含0):/^-(\d|[1-9]\d+)$/;
判断手机号(简单版):
var reg=https://www.jb51.net/^1\d{10}$/;
判断邮箱
第一部分:数字、字母、下划线、- 一到多位
第二部分:@
第三部分:数字、字母、 一到多位
第四部分:(.两到四位) .com .cn .net .. .com.cn
var reg =https://www.jb51.net/^[0-9a-zA-Z_-]+@[0-9a-zA-Z-]+(\.[a-zA-Z]{2,4}){1,2}$/
判断年龄在18到65之间的
18-19/20-59/60-65
var reg =https://www.jb51.net/^((18|19)|([2-5]\d)|(6[0-5]))$/
真实有效的中华人民共和国姓名 2-4 位汉字
var reg = /^[\u4e00-\u9fa5]{2,4}$/;
身份证号码
前六位是省->市->县(区)
四位年 两位月 两位日
简单版
var reg = /^\d{17}(\d|X)$/;
130828199012040617
复杂版
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X)$/;
细节知识点
里面出现的任何字符都是代表本身意义的,例如:[.]中的”.“就是代表一个小数点而不是除了\n以外的任意字符
里面出现18不是数字18而是1或者8,例如[18-65]是1或者8-6或者5中任选一个
1、exec正则的捕获方法--->先匹配,然后把匹配的内容捕获
如果字符串没有匹配这个正则,捕获的返结果是null
如果和正则匹配,返回的结果是一个数组
例子
var str ="2015zhufeng2016peixun"
var reg = /\d+/;
第一项是我们捕获的内容
index:捕获的内容在元字符串中开始的索引位置
input:捕获的原始字符串
2、正则的捕获是懒惰的
正则的每一次捕获都从lastIndex值开始,第一次捕获的时候,lastIndex=0,从原始字符串索引为0的位置开始查找捕获,而默认的情况下,第一次捕获完成,lastIndex的值并没有发生改变,还是0,所以第二次捕获还是从原始字符串索引为0处开始查找,这样找到的还是第一次捕获的内容
解决办法:添加全局修饰符g--->加上g后,第一次捕获完成后,lastIndex的值发生了改变,变为第一次捕获内容后的第一个字符的开始索引,第二次捕获是继续向后查找的...
疑问:不用全局修饰符g每次捕获完成后手动修改lastIndex的值不可以么?
不可以,虽然手动修改了lastIndex,确实把lastIndex的值进行改变了,但是正则查找的时候还是从索引0开始的
var str = "zhufeng2015peixun2016"; var reg = /\d+/g;
例子
为了防止没有加全局修饰符g导致的死循环,我们在处理之前,对于没有添加g的手动给添加一个g