1、正则的概念:是一种规则,用来处理字符串的一个规则
正则的作用:
匹配:判断一个字符串是否符合限定的规则 test()
捕获: 获取到字符串中符合我们正则的内容 exec()
2、创建一个正则
两种方式:实例创建:
var reg=new RegExp("");//传入的是一个字符串
字面量方式:
var reg=/\d/;
创建正则的两种方式的区别:在字面量方式中,用// 包起来的所有内容都是元字符,有的具有特殊意义,大部分都是代表本身含义的普通的元字符。
需要匹配2018hui2019
var name="hui";
var reg=/^\d+"+name+"+\d+$/;
console.log(reg.test(2018hui2019));//false
console.log(reg.test(2018name2019));//true
对于以上需求,只能使用实例创建。
var reg=new RegEXp("^\\d+"+name+"\\d+$","g");
3、一些常用的元字符
每个正则都是由元字符和修饰符组成的
\d 代表0-9之间的数字
\D 除了0-9之外的任意字符
* 出现0-多次
+ 出现1-多次
? 出现0-1次
{n} 出现n次
{n,m} 出现n-m次
[XYZ] X或Y或Z中的一个
[^XYZ] 除了XYZ中的任何一个字符
\b 匹配边界符
\w 数字、字母、下划线中的任意一个字符[0-9a-zA-Z_]
\s 匹配一个空的字符,空格,制表符,换页符
4、实例
(1)有效数字的正则
var reg=/^[+-]?(\d|([1-9]\d+))(\.\d+)?$/;
分析:在中括号中出现的所有字符都是代表本身意义的字符。对于数字可以出现正数也可以出现负数。第二个括号里,指整数部分。整数部分是一位数那么可以是0-9.如果是多位数,则必须以1-9开头。第二括号里是小数部分,可以出现也可以不出现,所以用?号。.用了转义字符。
(2)年龄介于18-65之间
var reg=/^(1[8-9]|[2-5]\d|6[0-5])$/;
(3)验证邮箱的正则
var reg=/^[\w.-]+@[0-9a-zA-Z]+(\.[a-zA-Z]{2,4}){1,2}$);
5、正则的捕获 exec()
捕获到的内容格式
捕获到的是一个数组,数组的第一项是当前大正则捕获的内容。第二项index 捕获的内容在字符串中开始的索引位置 第三项input 原始字符串
正则捕获的特点:
懒惰性和贪婪性
懒惰性:每次执行exec()只捕获第一个匹配的内容,在不进行任何处理的情况下,执行多次捕获,捕获的还是第一次匹配的内容。(原因:lastIndex,正则每一次捕获在字符串中开始查找的位置,由于每次都是0,从开始处查找,所以具有懒惰性)
解决:在正则末尾加修饰符g
贪婪性:正则的每一次捕获都是按照匹配最长的结果捕获的
解决:在量词元字符后面添加一个?即可
?在元字符后面表示出现0-1次
在量词元字符后面是取消捕获时的贪婪性
match 方法 把所有和正则匹配的字符串都获取到
var reg=/\d+?/g;
Var str= “hui2018xia2019”;
Var ary=str.match(reg);
Ary 的结果为:[2,0,1,8,2,0,1,9]
但是有些exec()可以实现,但是Match不可以,match 只能捕获到大正则匹配的内容,对于小正则捕获的内容是无法获取的
正则分组
改变优先级(2)分组引用
?:指只匹配不捕获
6、replace
把原有字符串替换成新的字符串
不使用正则,一次只能替换一个字符串
使用正则(并且是全局匹配),则可以替换多个匹配到的字符串
实现原理:
str=str.replace(/d+/g,function(){
return //要替换的内容
}
匹配多少次字符,执行多少次function()。在每一次执行函数时,我们可以获取我们捕获的内容,和我们单独执行exec()捕获的内容一致。Arguments 一般是三项,0--大正则捕获的内容,1--捕获开始的索引,2--原有的字符串
如果存在小分组,/(zhu)(ff)/g 则arguments 一共有5项。
在function中通过return 返回我们要替换的内容,不写则替换成undefined
不实现替换 return arguments[0]即返回匹配的字符本身
实例:
(1)模板引擎实现的初步原理
var str="my name is{0},my age is{1},i come from{2},i love{3}";
var ary=["wang","19","china","js"];
str=str.replace(/{(\d+)}/g,function(){
return ary[arguments[1]];//小正则捕获的内容
});
(2)从url 中获取到有用参数并且保存成键值对格式
使用exec()
var url="http://kbs.sports.com/game.htm?mid=1000&cid=1467&app=1";
var reg=/([^?=&]+=([^?=&]+)/g;
var obj={};
var res=reg.exec(url);
while(res){
obj[res[1]]=res[2];
res=reg.exec(url);
}
使用replace
url.replace(/[(^?=&]+)=(^?=&]+)/g,function(){
obj[arguments[0]]=arguments[1];
}
结果为:
var obj={
mid:"1000";
cid:"1467";
app:"1"
}
(3)格式化日期
2018-11-12 22:09:02要格式化为2018年11月12日 22时09分02秒
var str="2018-11-12 22:09:02",reg0=/^(\d{4})[-/](\d{1,2})[-/](\d{1,2})[-/] (\d{1,2}):(\d{1,2}):(\d{1,2})$/g;
var ary=[];
str.replace(reg,function(){
ary=[].slice.call(arguments);//将类数组转换为数字
ary=ary.slice(1,6);//从索引1开始,依次找到这6个字符串,arguments[0]是大正则匹配到的内容,是原始字符串
});
var resStr="{0}年{1}月{2}日{3}时{4}分{5}秒",reg1=/{(\d+)}/;//不仅需要捕获大正则,还需要小正则,因为要当做ary的索引
resStr=resStr/replace(reg1,function(){
var num=arguments[1];
var val=ary[num];
val.length==1?val="0"+val:void 0;
})