0 概述
0.1 正则概念
就是一个规则,用来处理字符串的一个规则
0.2 正则的用处
- 匹配:判断一个字符串是否包含我们所指定的规则 ref.test(str)
- 捕获:把字符串中符合规则的内容捕获到 ref.exec(str)
0.3 正则的元素
每一个正则表达式都是由元字符和修饰符组成的
- 【元字符】在//之间具有意义的一些字符
- 【量词元字符】代表出现次数数量的元字符
- 【特殊符号】((),[])
- 【修饰符】
① global(g):全局匹配
② ignoreCase(i):忽略大小写匹配
③ multiline(m):多行匹配
1 创建正则
我们可以先看看正则里都包含了哪些
console.log(RegExp.prototype);
1.1 字面量方式
var reg = /\d/
1.2实例创建
var reg = new RegExp(“”)
1.3两者区别
- 字面量:在字面量方式中,我们//之间包起来的所有内容都是元字符,有特殊意义的,大部分都是代表本身含义的普通的元字符
1
2
3
4var name = zhu;
var reg = /^\d+"+name+"\d+$/g;
Console.log(reg.test("2015zhu2016"))// false;
Console.log(reg.test('2015""nameeeee2016'))// true;
在这段代码中,并非是name代表zhu而是仅代表name本身,并且+为出现e的次数
- 创建实例
1
2var reg = new RegExp("/^\\d+"+name+"\\d+$/",g);
console.log(reg.test("2015zhu2016")) //true;
这里name就代表的是zhu
注意:1.创建实例中转移符为两个\\d
2.创建实例中修饰符作为第二个参数传入
1.4 字符串match方法
字符串中的match方法:把所有和正则匹配的字符都获取到1
2
3
4var reg = /\d+?/g;
var str = "zhufeng2015peixun2016";
var ary = str.match(reg);
console.log(ary)
虽然当前情况下,match比我们的exec更加的简便一些,但是match中存在一些自己处理不了的问题:在分组捕获的情况下,match只能捕获到大正则匹配的内容,而对于小正则捕获的内容是无法获取的
1.5 字符串中replace
把原有的字符串替换成新的字符
在不使用正则的情况下,每当执行一次只能替换一个字符1
2
3var str = "zhufeng2015zhufeng2016"
str = str.replace("zhufeng","zhufengjiaoyu").replace("zhufeng","zhufengjiaoyu")
// "zhufengjiaoyujiaoyu2015zhufeng2016"
这样出现zhufengjiaoyujiaoyu并没有实现需求;1
2
3
4var str = "zhufeng2015zhufeng2016"
str = str.replace(/zhufeng/g,"zhufengjiaoyu");
console.log(str);
// "zhufengjiaoyu2015zhufengjiaoyu2016"
replace第一项的值是一个正则的实现原理
2 语法规则
2.1 元字符
在//之间具有意义的一些字符
\:转义字符,转义后面字符所代表的含义
^ :以某一元字符开始
$ :以某一元字符结束
\n :匹配一个换行符
. :除了\n以外的任意字符
1 | var reg = /^0.2$/ // 以0开头2结尾中间除了\n的任意字符 |
x|y:x或y其中一个
[xyz]:x或者y或者z其中一个
[^xyz]:除了xyz之外的任意字符
[a-z]:a-z之间任意一个字符
[^a-z]:除了a-z之间任意一个字符
\d:一个0-9之间的数字
\D:除了0-9之外的任意字符
\w:数字,字母,下划线中的任意一个字符 [0-9a-zA-Z_]
\b:匹配一个边界符
\s:匹配一个空白字段,空格或制表符,换页符
2.2 量词元字符
代表出现次数数量的元字符
*:出现0到多次
+:出现1到
?:出现0或1次
{n}:出现n次
{n,}:出现n到多次
{n,m}:出现n到m次
一个简单的手机验证1
var reg= /^1\d(10)$/
2.3 特殊符号
- ()
分组作用改变x|y的优先级var reg = /^18|19$/;
可以是18,19,189,119,819,1819….
var reg = /^(18|19)$/;
只能是18,19
- []
1) 在括号中出现的所有字段都代表本身意思的字符串(没有特殊含义)1
2
3var reg = /^0[.]$/ // 以0开头2结尾中间除了\n的任意字符
console.log(reg.test("1")) // false
console.log(reg.test(".")) // true
2) 中括号中不识别两位数1
2
3var reg = /^[12]$/ // 1或者2中的其中一个
var reg = /^[12-68]$/ // 1,2-6中的一个,8 三个中的一个
var reg = /^[\w-]$/ // 数字,字母,下划线,-中的一个
2.4 修饰符
修饰符可以有效的解决正则捕获的懒惰性
global(g):全局匹配
ignoreCase(i):忽略大小写匹配
multiline(m):多行匹配
3 正则用法
3.1 匹配
判断一个字符串是否包含我们所指定的规则
ref.test(str)
1 | var reg = /\d/ //包含一个0-9之间的数字 |
3.2 捕获
把字符串中符合规则的内容捕获到
ref.exec(str)
1 | var reg = /\d/; |
3.3 捕获的内容格式
第一项为当前数组最大正则捕获的内容
index:捕获内容所在开始索引位置
input:捕获的原始字符串
1
2
3
4 var reg = /\d+/;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(res); //["2015",index:7,input:"zhufeng2015peixun2016"]
3.4 正则捕获的特点
1.懒惰型
每一次执行exec只捕捉第一个正则匹配的内容,在不进行任何处理的情况下,在执行多次捕捉,不做的还是第一个匹配内容
第一次:1
2
3
4var reg = /\d+/;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(res); //["2015",index:7,input:"zhufeng2015peixun2016"]
第二次:还是一样1
2
3
4var reg = /\d+/;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(res); //["2015",index:7,input:"zhufeng2015peixun2016"]
如何解决懒惰型: 在正则末尾加上一个修饰符g
原理:加了全局修饰符g,正则每一次捕获或,我们的lastIndex的值都变为了最新的值,下一次捕获从最新的位置开始查找。1
2
3
4
5
6
7var reg = /\d+/g;
var str = "zhufeng2015peixun2016";
var res = reg.exec(str);
console.log(reg.lastIndex); //匹配开始位置 0
console.log(res); //[“2015”,index:7,input:“zhufeng2015peixun2016”]
Console.log(reg.lastIndex); //匹配开始位置 11
console.log(res); //[“2016”,index:7,input:17“zhufeng2015peixun2016”]
捕获全部内容:1
2
3
4
5
6
7
8var reg = /\d+/g;
var str = "zhufeng2015peixun2016";
var arr = [];
while(res){
arr.push(res[0]);
res = reg.exec(str);
}
console.log(arr);
2.贪婪性
正则的每一次捕获都是按照匹配最长的结果捕获的例如:2符合正则2015也符合正则,我们默认捕获的是2015
如何解决贪婪性:在量词元字符后面加上?即可1
2
3
4
5
6
7
8var reg = /\d+?/g;
var str = "zhufeng2015peixun2016";
console.log(reg.exec(str)); //["2",....]
var ary = [],res = reg.exec(str);
while(res){
ary.push(res[0]);
}
console.log(ary);
4正则分组
4.1 分组引用
\2代表和第二个分组出现一模一样的内容;\1和第一个分组出现一模一样的内容:
一模一样:和对应的分组中的内容的值都要一样1
2
3var reg = /^(\w)\1(\w)\2$/;
Console.log(reg.test("zzff")); //true
Console.log(reg.test("z0f_")); //false
4.2 分组捕获
正则在捕获的时候,不仅仅把大正则匹配的内容捕获到,而且还可以把小分组匹配的内容捕获到
(?:)在分组中?:的意思是只匹配不捕获
1 | var reg = /^(\d{2}(\d{4})(\d{4})(\d{2})(\d{2})(?:\d{2})(\d)(?:\d|X))$/ |
ary[0] 大写正则匹配的全部内容
ary[1] 第一个分组捕获的内容
ary[2] 第二个分组捕获的内容
Match捕获:
console.log(str.match(reg))
和exec获取的结果一样
不同:1
2
3
4
5var reg = /zhufeng(\d+)/g
var str = "zhufeng1234zhufeng3456zhufeng5678";
console.log(reg.exec(str)); //["zhufeng1234", "1234", index: 0, input: "zhufeng1234zhufeng3456zhufeng5678", groups: undefined]
console.log(reg.exec(str)); //["zhufeng3456", "3456", index: 11, input: "zhufeng1234zhufeng3456zhufeng5678", groups: undefined]
console.log(reg.exec(str)); //["zhufeng5678", "5678", index: 22, input: "zhufeng1234zhufeng3456zhufeng5678", groups: undefined]
而match只能捕获大正则匹配的内容1
console.log(str.match(reg)) //["zhufeng1234", "zhufeng3456", "zhufeng5678"]
5 练习
1.有效数字的正则
1)”.”可以出现也可以不出现,一旦出现后面要跟着一位或多位数字
2)最开始可以使+/-也可以没有
3)整数部分,一位数可以使0-9之间的一个,多位数不能以0开头1
var reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
2.年龄介于18-65之间 18-19 20-59 60-651
var reg = /^[+-]?(\d|([1-9]\d+))(\.\d+)?$/
3.邮箱认证(简版)
左侧:数字,字母,下划线。。。1
var reg = /^[\w.-]+@[0-9a-zA-Z]+(\.[a-zA-Z]{2,4})(1,2)$/;
4.中国标准实名2-4位1
var reg = /^[\u4e00-\u9fa5]{2,4}$/
5.身份证号1
2
3var reg = /^\d{17}(\d\X)$/
// 21 0302 1990 12 30 00 1 9
var reg = /^(\d{2}(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X))$/
最后更新: 2018年11月25日 17:24