JS中正则的基础知识

正则基础知识


正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则的组成

正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为”元字符”)组成的文字模式。
元字符: 每一个正则表达式都是由元字符和修饰符组成的,在//之间具有意义的一些字符就是元字符;元字符大致分为两类一类是具有特殊意义的元字符,另一类是代表出现次数的量词元字符。

// 1、具有特殊意义的元字符
        //  \ :转义字符,转义后面字符所代表的含义
        //  ^ :以某一个元字符开始
        //  $ :以某一个元字符结束
        // \n :匹配一个换行符
        //  . :除了\n意外的任意字符
        // () :分组->把一个大正则划分成几个小的正则
        // x|y : x或者y中的一个
        // [xyz]: x或者y或者z中的一个
        // [^xyz]:除了三者以外的任何一个字符
        // [a-z]:包含a-z之间的任何一个字符
        // [^a-z]:除了a-z之间的任何一个字符
        // \d:一个0-9之间的数字
        // \D:除了0-9之间的数字意外的任何一个字符
        // \b:匹配一个边界符 "w1 w2 w3"
        // \w:数字、字母、下划线中的任意字符 [0-9a-zA-Z_]
        // \s:匹配一个空白字符 空格、一个制表符、换页符...
// 2、代表出现次数的量词元字符
        //  * :出现0-多次
        //  + :出现1-多次
        //  ?:出现0次或者1次
        // {n}:出现n次
        //{n,}:出现n次到多次
        //{n,m}:出现n次到m次
如何创建正则

在理解的正则的基本组成部分后我们来熟悉自己创建一个正则表达式。
构造正则表达式的方法和创建数学表达式的方法一样。也就是用多种元字符运算符可以将小的表达式结合在一起来创建更大的表达式。

// 字面量方式:
var reg = /\d/;

// 实例创建方式:
var reg =new RegExp("");

var name = 'xuptzjc';
//如果我们想实现用正则将字符串拼接起来首先我们尝试使用字面量的方式
var reg=/^\d+"+name+"\d+$/;
console.log(reg.test("2017xuptzjc2018"));
//test是我们正则中的匹配方法,它的作用是判断一个字符串是否包含我们制定的规则,如果包含就返回true,如果不就返回false
//-> 控制台中输出false
console.log(reg.test('2017"""nameeeee"2018'));//-> 控制台中输出true
//由以上我们可以得出在我们使用字面量方式的时候在正则表达式中不能使用字符串的拼接这个方法,那是为什么呢?
//原因:因为在定义中我们默认//之间的所有内容都是元字符所有我们的“+”就变成了正则表达式这里的量词元字符故而会出现错误。所以在这种情况下我们就不能够使用这种方式来定义正则了。需要使用实例创建的方法来完成我们的目标。
var reg = new RegExp("^\\d+" + name + "\\d+$", "g");
console.log(reg.test("2015zhufeng2016")); //->控制台输出true
console.log(reg.test('2015"""nameeeee"2016')); //-> 控制台输出false

综上所述我们能够找到创建正则的这两种方式之间的不同:

1) 字面量方式中出现的一切都是元字符,所以不能实现变量值的拼接,而实例创建时可以的
2) 字面量方式中直接写\d就可以了,而在实例中需要把它转义 \d

正则的捕获

就像之前我们提到的匹配一样,我们JS中正则的捕获也有相对应的方法:exec

注意:每次捕获的时候都是先进行默认的匹配,如果没有匹配成功的,那么捕获的结果为null,只有有匹配的内容是一个数组才能捕获到

捕获到的内容格式:
捕获到的内容是一个数组,数组中的第一项是当前大正则捕获的内容;其中index:捕获内容在当前字符串中开始的索引位置,input:捕获的原始字符串
正则捕获有两大特点:
懒惰性:每一次执行exec只捕获第一个匹配到的内容,在不进行任何处理的情况下,执行多次捕获,每次捕获的还是第一次匹配的内容

首先我们先了解一下正则表达式的一个属性lastIndex是正则每一次捕获字字符串中开始查找的位置,默认值为0;

var rag = /\d+/;
var str = 'zhufeng2015peixun2016';
console.log(rag.lastIndex);//->0
var res = rag.exec(str);
console.log(res);//->["2015", index: 7, input: "xuptzjc2015peixun2016", groups: undefined]
//第二次通过exec捕获到的还是第一个“2015”
console.log(rag.lastIndex);//->0 说明我们第二次捕获时候也是要从字符串索引0开始查找
var res = rag.exec(str);
console.log(res);//->["2015", index: 7, input: "xuptzjc2015peixun2016", groups: undefined]


2)如何解决懒惰性:在正则的末尾加一个修饰符“g”;
//首先我们要了解一下正则表达式中的几个修饰符:g、i、m
        // global(g):全局匹配
        // ignoreCase(i):忽略大小写匹配
        // multiline(m): 多行匹配
// 原理:加了全局修饰符g,正则每一次结束后,我们的lastIndex的值都变成了最新的值,下一次捕获从最新的位置开始查找这样就可以把所有要捕获的内容都捕获了
var reg = /\d+/g;
var str = 'xuptzjc2015peixun2016';
console.log(reg.lastIndex);//->0
 console.log(reg.exec(str));//->["2015", index: 7, input: "xuptzjc2015peixun2016", groups: undefined]
console.log(reg.lastIndex);//->11
console.log(reg.exec(str));//->["2016", index: 17, input: "xuptzjc2015peixun2016", groups: undefined]
console.log(reg.lastIndex);//->21
console.log(reg.exec(str));//->null

//3).自己编程获取正则捕获的所有内容(一定不要忘记加g)
var reg = /\d+/g;
var str = 'xuptzjc2015peixun2016yangfan2017';
var ary = [];
var res = reg.exec(str);
while(res){
     ary.push(res[0]);
     res = reg.exec(str);
}
console.log(ary);

贪婪性:正则每一次捕获都是按照匹配最长的结果捕获的

        var reg = /\d+/g;//->出现1-多个0-9之间的数字
        var str = 'xuptzjc2015peixun2016yangfan2017';
        console.log(reg.exec(str));//->["2015", index: 7, input: "xuptzjc2015peixun2016", groups: undefined]

//5)如何解决正则的贪婪性:在量词元字符后面添加一个问好即可
//?在正则中有很多的作用
//放在一个普通的元字符后面代表出现0-1次 /\d?/ ->数字可能出现也可能不出现
//放在一个量词的元字符后面是取消捕获时候的贪婪性
        var reg = /\d+?/g;
        var str = 'xuptzjc2015peixun2016yangfan2017';
        // console.log(reg.exec(str));//["2", index: 7, input: "xuptzjc2015peixun2016yangfan2017", groups: undefined]
        var ary = [];
        var res = reg.exec(str);
        while(res){
            ary.push(res[0]);
            res =reg.exec(str);
        }
        console.log(ary);
//["2", "0", "1", "5", "2", "0", "1", "6", "2", "0", "1", "7"]
//3、字符串中的match方法:把所有和正则匹配的字符都获取到
        var reg = /\d+?/g;
        var str = 'xuptzjc2015peixun2016yangfan2017';
        var ary = str.match(reg);
//->(12) ["2", "0", "1", "5", "2", "0", "1", "6", "2", "0", "1", "7"]

//虽然在当前的情况下match比我们的exec更加的简便一些,但是match中存在一些在即处理不了的问题:在分组捕获的情况下,match只能捕获到大正则匹配的内容,而对于小正则捕获的内容是无法获取的

猜你喜欢

转载自blog.csdn.net/weixin_41884599/article/details/81413661