javascript 正则表达式

创建正则的两种方式

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()的作用
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值