正则表达式基础知识 浅析

1. 正则表达式是一个用于查找的,含有通用字符串和匹配元字符的字符串

2. 正则表达式对象的创建

构造函数

var regex = new RegExp(正则表达式 , 匹配模式)

    var regex1 = new RegExp("abc");

字面量

var regex = /正则表达式/;

var regex2 = /abc/;

3. 正则表达式的匹配

语法: 正则对象.test(“字符串”)----->boolean值

    var str="hudfpfomnvaioHellosaiossadf"

    var regex = /Hello/;

console.log(regex.test(str));       返回true

4. 元字符

基本元字符

1.   表示任意一个非换行的字符,没有限制

案例:foot 或者food或者foo…,可写成foo.

2( )   表示分组和提高优先级

3[ ]   表示一个出现在[ ]中的字符

案例:[abc]表示匹配a或b或c;foo[td]匹配foot或food

如果是连续数字或字母可使用连字符链接例如:

[0123456789]: 等价于[0-9],只能是一位数字,如果超过一位例如[0-12]则表示0或1或2,并不是0,1,2,3,4,5,6,7,8,9,10,11,12

[abcdef……xyz]:等价于 [a-z]

4|   表示或

5   转义字符  使符号表示其原貌

案例:表示点:   .    表示( ): ( )     表示[ ]:  [ ]

限定元字符

1*  表示紧跟前面的一个字符或一组字符出现0或多次

案例:123*   表示12、123、1233、……、12333333……

      1(23)*  表示12、12323、1232323、……、1232323…….

2+  表示紧跟前面的一个字符或一组字符出现1或多次

案例:123+   表示123、1233、……、12333333……

      1(23)+  表示12323、1232323、……、1232323…….

3?  表示紧跟前面的一个字符或一组字符出现01

案例:http://.+ | https://.+ 可写成https?: //.+

可使用(正则|)的表达方式,表示出现或者为空不出现

例如上述代码可写成http(s|): //.+   这样的写法可提高代码性能

4{数字}  表示紧跟前面的字符出现的指定次数

案例:a{3}   表示aaa

5{数字 ,  }表示紧跟前面的字符至少出现指定次数

案例:a{3 , }   表示aaa、aaaa、aaaaa、aaaaaa……

6{数字, 数字}表示紧跟前面的字符出现的次数范围

案例:a{1 , 3}   表示a或aa或aaa

7?: 匹配但不捕获的元字符

案例:使用exec()()匹配和捕获邮箱信息时,在不需要捕获的正则表达式之前加上?:即可 :  /([a-zA-Zd]+)@([a-zA-Zd]+(?:.[a-zA-Zd]+)+)/g

8数字反向引用元字符

在正则表达式中使用组( )匹配到某一数据时, 允许在该正则表达式中使用数字的方式引用该组,数字代表匹配到的组的序号,即从左到右数第几组

案例:/<(w+)>.*</1>/g 具体信息见第7

9[^字符] 否定元字符,表示[^ ]中的字符不出现

案例:[^abc]  表示不是a,也不是b,也不是c

首尾元字符

1)首  ^  表示必须以XXX开头

案例:^a   表示必须以a开头的字符串

2)尾  $  表示必须以XXX结尾

案例:a$  表示必须以a结尾的字符串

简写元字符

1s 表示空白字符,包括空格,Tab,回车换行等

   S 表示非空白字符,常常用[sS]表示任意字符

2w 表示字符,包含字母,数字,下划线

   W 表示非字符

3d 表示数字  0~9

   D 表示非数字

5. 正则表达式简单案例

邮箱:

/^[0-9a-zA-Z]+@[0-9a-zA-Z]+(.[0-9a-zA-Z]+)+$/

匹配0~255之间的数字

/^([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])$/

匹配小数

/^((-?[1-9][0-9]*|0)(.[0-9]*[1-9]|))$/

6. 正则表达式的提取exec

语法:正则表达式对象.exec(字符串) --> 封装成数组

    var str = "asa123sfsgd345dfgshd456";

    var regex = /d+/;

    var result = regex.exec(str);

获得一个只有一个索引号0的数组

循环提取

在一个字符串中将所有复合的要求的字符串提取出来

a) 正则表达式需要使用全局模式  使用g表示全局模式

        var regex = new RegExp( '正则', 'g' );

        var regex = /正则/g;

b) 调用 exec()

首先获得第一个匹配项,再调用一次,就可再获得一个匹配项,循环调用下去,可以得到所有的匹配项,直到全部匹配完后还用调用该方法, 则返回 null

示例代码如下:

var str = "asa123sfsgd345dfgshd456";

var regex = /d+/g;

                 regex.exec( str )                    获得 123

                 regex.exec( str )                    获得 345

                 regex.exec( str )                    获得456

                 regex.exec( str )                    获得 null

使用while循环替代上述操作:

                 while ( res = regex.exec( str ) ) {

                         console.log(res);

                 }

提取出匹配的数组,共提出3个数组

c) 正则表达式的匹配分组

    var str = "邮箱, tabb@tabb.cn, abc@126.com 和 1234567@qq.com";

    var regex = /([a-zA-Zd]+)@([a-zA-Zd]+(.[a-zA-Zd]+)+)/g;

    var res;

    while (res = regex.exec(str)) {

        console.log(res);

}

正则表达式通过调用exec()提取出的数组,如果正则表达式中有( )则首先按照完整的正则表达提取内容,然后再依次按照” ( ”左括号,从左到右的顺序提取( )括号中的内容,所有内容按照数组索引顺序放入数组中,得到如上图所示的结果

正则表达式匹配但不捕获的元字符(?:)  可提高性能

    var str = "邮箱, tabb@tabb.cn, abc@126.com 和 1234567@qq.com";

    var regex = /([a-zA-Zd]+)@([a-zA-Zd]+(?:.[a-zA-Zd]+)+)/g;

    var res;

    while (res = regex.exec(str)) {

        console.log(res);

}

匹配但不捕获最后一个(?:.[a-zA-Zd]+) .cn、.com等的正则表达式内容

7. 正则表达式的反向引用数字

在正则表达式中使用组( )匹配到某一数据时, 允许在该正则表达式中使用数字的方式引用该组,数字代表匹配到的组的序号,即从左到右数第几组

匹配HTML的示例代码:

    var str = "123<div>456</div>abc<span>sdf</span><i></i>123";

    var regex = /<(w+)>.*</1>/g;    引用第一组数据,即内容与其一样才匹配

    var res;

    while (res = regex.exec(str)) {

        console.log(res[0]);

}

如果代码做如下修改</div>改为</dv>,则匹配结果发生变化:

    var str = "123<div>456</dv>abc<span>sdf</span><i></i>123";

    var regex =  /<(w+)>.*</1>/g;

    var res;

    while (res = regex.exec(str)) {

        console.log(res[0]);

    }

即不能匹配到<div></div>,说明反向引用1必须和其引用项内容一致才匹配

8. 正则表达式的贪婪模式

凡是在正则表达式中, 涉及到次数限定的, 一般默认都是尽可能的多匹配,这就是贪婪模式

    var str = "123<div>456</div>abc<div>sdf</div><i></i>123";

    var regex = /<(w+)>.*</1>/g;

    var res;

    while (res = regex.exec(str)) {

        console.log(res[0]);

}

匹配结果如上图所示,"123<div>456</div>abc<div>sdf</div><i></i>123"中匹配了包含内容最多的<div></div>标签,表现出贪婪模式效果

解除贪婪模式:

解除贪婪模式. 只需要在次数限定符后面加上?即可

上述代码中*即为次数限定符,只需在其后添加?即可解除贪婪模式

var regex = /<(w+)>.*?</1>/g;

值得注意的是,贪婪模式的性能会略高于非贪婪模式的性能,所以一般不考虑贪婪的问题,只有在却有需求时,才取消贪婪

9. 正则替换

简单替换

'aaaaa-bbbbb-ccccc'.replace( /w+/g, 'good' )

将字符串中的aaaaa、bbbbb、ccccc替换成good

'a-----b-----c'.replace( /-+/g, '-' )

将字符串中的-----符号替换成-符号,字符串变为:a-b-c

分组替换

'2016-8-28'.replace( /(d+)-(d+)-(d+)/g , '$1$2$3日' )

将”2016-8-28”替换为了2016年8月28日

使用( )对正则表达式进行分组,其中( )包裹的内容为一个组,从左至右一共有3个组,$1表示获取第一个组的内容,$2表示获取第二个组的内容,$3表示获取第三个组的内容

函数替换

将邮箱名用*号隐藏起来:

    console.log('邮箱:abc@abctabb.cn, 邮箱: defhchd@deftabb.cn'.

         replace( /(w+)@(w+(.w+)+)/g, function ( s, g1, g2, g3 ) {

             var first = g1.charAt( 0 );    保留邮箱名首字母

             var arr = [ ];

             for ( var i = 0; i < g1.length - 1; i++ ) {

                 arr.push( '*' );

             }

             return first + arr.join(“”)+"@"+g2;

         } ))

( )为分组,从左向右数” ( ”,函数中s代表整个正则表达式,g1代表第一组,g2代表第二组,g3代表第三组

原文地址:https://www.cnblogs.com/Tabb/p/6498982.html