创建正则的两种方式
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()的作用
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/20312.html