正则表达式

作者: YingQQQ | 来源:发表于2016-11-24 18:33 被阅读0次

    一、什么是正则表达式

    Regular Expression使用单个字符串来描述、匹配一系列符合某个语句规则的字符串。简单的说就是按照某种规则去匹配符合条件的字符串,目的可以是替换或者查找等等。这里推荐一个网站:http://regexper.com

    1、生成正则表达式

    在javascript中我们通过内置对象RegExp来生成一个正则表达式,有两种方式支持:
    1、自变量。

    var reg= /\bdog\b/g;
    var test ='he is a dog,he is a dog ,where is she?';
    test.replace(reg, 'boy')//he is a boy,he is a boy ,where is she?’
    

    2、实例化构造函数

    var reg = new RegExp('\\bdoy\\b','g')
    var test ='he is a dog,he is a dog ,where is she?';
    test.replace(reg, 'boy')//he is a boy,he is a boy ,where is she?’
    
    2、正则表达式中的修饰符
    g:global,表示全文搜索,不添加,搜索到第一个匹配停止,
    i:ignore case 忽视大小写,默认大小写敏感,
    m: multiple lines 多行搜索,
    
    
    3、正则表达式中的元字符

    正则表达式有两种基本的元字符组成:1 原义本字符(符合原本的字符,例如'a'就是去匹配'a');2元字符(在正在表达式中有特殊含义的非字母字符, 例如'\b'表示单词边界)

    4、正则表达式中的字符类

    1、一般情况下正则表达式一个字符对应字符串一个字符,但有时候我们也需要匹配一类字符,这个时候我们用元字符[]去构建一个简单的类。这个类是泛指的,可以是其中一个。

    var test = 'a1b2c3d4';
    var reg = /[abc]/g
    test.replace(reg,'Q')//"Q1Q2Q3d4"
    

    2、字符类取反
    使用元字符^创建一个反向类,反向类意思是不属于某个类:

    var test = 'a1b2c3d4';
    var reg =/[^abc]/g
    test.replace(reg,'Q')//"aQbQcQQQ"
    

    3、范围类
    正则表达式提供了一个范围类,例如我们可以使用[a-z]表示我们可以使用a到z的任意字符,这是一个闭区间包含了a和z本身。

    var test = 'a1b2c3d4';
    var reg =/[a-z]/g
    test.replace(reg,'Q')//"Q1Q2Q3Q4"
    

    当然[]接受连写,[a-zA-Z]表示大小a到z或者A-Z。

    var test = 'a1b2c3d4WTU';
    var reg =/[a-zA-Z]/g
    test.replace(reg,'Q')//"Q1Q2Q3Q4QQQ"
    

    万一我们想匹配'-',怎么办呢?

    var test = '2016-11-11';
    var reg =/[0-9]/g
    test.replace(reg,'Q')//"QQQQ-QQ-QQ"
    var newreg =/[0-9-]/g//只需在后面在加-
    test.replace(newreg ,'Q')//QQQQQQQQQQ
    

    4、预定义类

    .等价于[^\r\n] //出来回车和换行之外的所有字符
    \d 等于[0-9]//数字字符
    \D 等于[^0-9]//非数字字符
    \s 等于[\t\n\x0B\f\r]//空白符
    \S 等于[^\t\n\x0B\f\r]//非空白符
    \w 等于[a-zA-Z_0-9]//单词字符(字母,数字及下划线)
    \W 等于[a-zA-Z_0-9]//非单词字符(字母,数字及下划线)
    

    例如要匹配一个ab加数字加任意字符:

    var reg =/ab[0-9][^\r\n]/g
    var somereg =/ab\d./g;//这两者是一样的但是一个更加简短
    

    5、正则表达式边界

    ^表示以xxx开始;
    $表示以xxx结束;
    \b表示单词边界;
    \B表示非单词边界;
    
    5、正则表达式中的量词

    如果你在正则表达式中需要匹配100次数字,那应该怎么操作呢?

    ?表示出现零次或者一次(最多出现一次)
    +表示出现一次或者多次(最少出现一次)
    *表示出现零次或者多次(任意次)
    {n}表示出现n次
    {n,m}出现n到m次
    {n,}至少出现n次
    
    6、正则表达式中的模式

    正则表达式有贪婪模式和非贪婪模式:

    贪婪模式就是经可能多的匹配:
    var reg =/\d{3,6}/g;
    var test='1234567';
    test.replace(reg,'Y')//"Y7",匹配6次。
    非贪婪模式就是经可能少的匹配:
    var reg =/\d{3,6}?/g;
    var test='1234567';
    test.replace(reg,'Y')//"YY7",匹配3次。
    
    7、正则表达式分组

    在javascript中使用()可以打到分组的目的。

    var reg = /([a-z]\d){3}/g;//匹配一个字母和任意数字
    var test = 'q1w2e3r4t5';
    test.replace(reg,'Y')//"Yr4t5"
    

    正则表达式中的或:

    var reg = /by(ess|hey)ee/g;//匹配byessee或者byheyee
    var test = 'byesseebyheyeea';
    test.replace(reg,'Y')//"YYa"
    

    方向引用:

    var reg = /(\d{4})-(\d{2})-(\d{2})/g;
    var test = '2016-12-12';//=>12-12-2016
    test.replace(reg,'$2-$3-$1')//"12-12-2016"
    

    有时候我们需要忽略分组:

    var reg = /(?:\d{4})-(\d{2})-(\d{2})/g;//只需在分组前面加上?:
    var test = '2016-12-13';//=>12-12-2016
    test.replace(reg,'$2-$4-$1')//"13-$4-12"
    
    7、正则表达式的前瞻

    正则表达式从文本从不开始解析再到尾部,顺方向称为'前',所谓前瞻就是正则表达式在匹配到规则的时候在前前部去检查断言部分。
    javascript中的正则支持正向前瞻(exp(?=assert))和负向前瞻(exp(?!assert))

    var test ='a1b2c3vv';
    var reg=/\w(?=\d)/g;
    test.replace(reg,'Y')//"Y1Y2Y3vv"
    

    这里我们只匹配了'a1b2c3'这部分中的‘abc’,因为我们还检查了断言部分(?=/d),但是不参与替换。

    var test ='a1b2c3vv';
    var reg=/\w(?!\d)/g;//任意字符断言部分不是数字的字符
    test.replace(reg,'Y')//"aYbYcYYY"
    

    二、javascript正则表达式对象属性

    属性

    lastIndex:是当前表达式匹配内容的最后一个字符的下一个位置(下一次匹配从哪里开始),
    source:正则表达式文本字符串(/..../里面的内容)
    

    方法
    test():用于测试字符串参数中是否存在匹配正则表达式规则的字符串,存在返回true,反之false。建议用test的时候不要加g、i等等,因为反复test之后lastindex这个货影响test结果

    var something ='ab';
    var reg=/\w/g;
    reg.test(something)//true
    reg.test(something)//true
    reg.test(something)//false
    while(reg.test(something)){
        console.log(reg.lastIndex)
    }//1.2第一次匹配到a,下次开始位置就是b(1)
    

    exec():使用正则表达式规则对字符串进行搜索,并将更新全局RegExp对象的属(lastIndex属性)性以反映匹配结果,如果没有匹配返回null,反之能返回一个数组,这个数组也有两个属性index(声明匹配文本的第一个字符位置)和input(存放被检索字符串的string)

    var something ='ab2s2ad3e2re5e2e';
    var reg1=/\d(\w)\d/;
    var reg2=/\d(\w)\d/g;
    var ret= reg1.exec(something)
    console.log(reg1.lastIndex+'\t'+ret.index+'\t'+ret.toString());//0  2   2s2,s
    while(ret =reg2.exec(something)){
    
    console.log(reg2.lastIndex+'\t'+ret.index+'\t'+ret.toString());
    }//5    2   2s2,s ;10   7   3e2,e;15    12  5e2,e
    

    reg1.lastIndex打印出0那是因为没有全局调用g。reg2.lastIndex表示第一次匹配的是'2s2',那下一次的位置就是后面的’a‘自然是第5个位置,ret.index都打印出2表示符合规则的’2s2‘第一次出现的位置是2,全局调用则会继续查找10和15,ret.index也是如此。
    ES6关于正则也有一些添加,之后在补充。

    相关文章

      网友评论

        本文标题:正则表达式

        本文链接:https://www.haomeiwen.com/subject/lprcpttx.html