正则深入理解及常用案例

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;
   })

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值