IT虾米网

javascript 正则表达式详解

luoye 2021年06月15日 编程语言 234 0

创建正则的两种方式

javascript中,通过字面量或者RegExp创建正则表达式;本文章主要介绍两种创建方式的不同及正则表达式的常用方法(test、exec)。

字面量方式

创建正则最简单的方式,是字面量方式,模式如下

var reg=/pattern/flag; 

正则由两部分组成,pattern和flag。

pattern是模式,是一个正则表达式;

flag是标志位,常用的有g、i;g是global全局匹配,i是insensitive,大小写不敏感。

test是正则最常用的方法之一,匹配返回true,反之,返回false

比如,匹配字符串中含有“name”

var reg=/name/;  
reg.test("myname"); 
//true 
var reg=/name/i;//大小写不敏感 
reg.test("mynaMe"); 
//true 

匹配特殊字符,需要对特殊字符进行转义,转义使用\ ,比如匹配字符串含有.name

var reg=/\.name/i;//使用了转义 
reg.test("my.naMeyourname"); 
//true 

开始和结尾(^和$)

开始和结尾是很重要的一环,比如判断整数的正则/\d*/,匹配“234w”,这是因为\d*与234匹配,虽然多了w,仍然匹配;如果加上^和$,那么表示开头和结尾之间必须是数字,多了w,所以是false;
综上所述,在写正则表达式时,一定要注意添加^和$

var reg = /\d*/; 
reg.test("2w");//true 
var reg = /^\d*$/; 
reg.test("2w");//false 

RegExp创建方式

我们也可以使用RegExp创建正则表达式,new RegExp(pattern,flag) ,注意,这里的pattern是纯表达式,不含有/pattern/中的/和/,并且转义的话,需要双重转义这里的双重转义跟java中的正则表达式字符串是一样的,都是双重转义。

var reg=new RegExp("name","i"); 
reg.test("myname"); 
//true 

匹配.name,第一次转义后是.name,再进行第二次转义后\.name

var reg=new RegExp("\\.name","i"); 
reg.test("mynsdfsdf.name"); 
//true 

常用方法

测试是否匹配test()

test方法上边我们已经使用了,用来测试是否匹配表达式,这个比较常用,一定要记住。

var type=/iamge\//; 
type.test("iamge/jpg"); 
//true 

捕获分组exec()

有时我们需要获取匹配结果,这是就需要使用exec函数,exec返回一个数组。
如,我想知道匹配表达式的字符串是什么,

var reg=/.at/; 
reg.exec("my,cat"); 
//获取到的匹配字符串是["cat"] 

exec()最主要的作用是用来获取匹配分组结果。

var reg=/(you(.at)?)mm/; 
reg.exec("youhatmmhome"); 
["youhatmm", "youhat", "hat"] 

exec()返回的第一个结果是最大匹配项,而后依次递减。我们观察结果,结果依次匹配(you(.at)?)mm、(you(.at)?)、.at,匹配项越来越往里。

再来一例
返回的数组,第一项是匹配的整个字符串,第二项是组匹配的项,因为加了g,全局匹配,所以,可以继续获取匹配结果集,直到null

var reg=/(.at)/g; 
reg.exec("aat,bat,cat,dat"); 
//["aat", "aat"]  
reg.exec("aat,bat,cat,dat"); 
//["bat", "bat"] 
reg.exec("aat,bat,cat,dat"); 
//["cat", "cat"] 
reg.exec("aat,bat,cat,dat"); 
//["dat", "dat"] 
reg.exec("aat,bat,cat,dat"); 
//null 

因为没有组,所以只返回匹配字符串,没有组匹配字符串;因为有g全局匹配,所以会一直匹配下去,直到返回null

var reg=/.at/g; 
reg.exec("aat,bat,cat,dat"); 
//["aat"]  
reg.exec("aat,bat,cat,dat"); 
//["bat"] 
reg.exec("aat,bat,cat,dat"); 
//["cat"] 
reg.exec("aat,bat,cat,dat"); 
//["dat"] 

关于匹配模式中g(lobal)的理解

g是Global的首字母,翻译过来就是全局匹配,可以这样描述g,获取到匹配的第一个结果后,继续往下获取匹配结果

如下例,字符串中存在两个匹配字符串分别是yname,rname,在获取到第一个匹配串后,因为有g(lobal),全局匹配,所以再执行exec会继续获取匹配结果

var reg=new RegExp(".name","g"); 
reg.exec("mynameyourname"); 
//["yname"] 
reg.exec("mynameyourname"); 
//["rname"] 

如果不加g,你会发现,总是获取第一个匹配结果,不会继续往下匹配。

var reg=new RegExp(".name"); 
reg.exec("mynameyourname"); 
//["yname"] 
reg.exec("mynameyourname"); 
//["yname"] 
reg.exec("mynameyourname"); 
//["yname"] 

使用string.replace,如果是全局匹配,那么会替换所有匹配串,

var reg=new RegExp(".name","g"); 
let str = "aaname,bbname" 
console.log(str.replace(reg,"1"))  //a1,b1 

总结

js中的正则要点不多,现在回想一下是否记住了呢?_

  • 字面量式正则比较常用,理解g、i的作用;
  • new RegExp(pattern,flag)与字面量方式的区别;
  • 掌握exec()的作用

发布评论
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

jquery ajaxFileUpload 只有第一次管用详解
你是第一个吃螃蟹的人
发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。