20140829分享正则大纲

1, 正则符号

^ 开头,  [^]非

$字符结尾(每行)

转义

.匹配除 外其他词

?前面0次或者1次

*前面的0+次

{n} n次

{n,} n+次

{n,m} n-m次

| 或

[123][0,3]集合 , [123]匹配123是不成立

[1-3][a-z][A-Z]集合范围

[^123][^a-z]集合非

d 0-9

D 非数字

s 空,包含f v

S 非空

()分组

2, 正则的组成

/正则/修饰符

new RegExp('正则', '修饰符');

修饰符: 

i不区分大小写   

g全局

m多行(开启的话^$以每行为目标)

3, 组合

^1[3-8]d{9}$

^d{7}$ 7位数

^(d{4})?d{7}$ 加4位区号

^(d{4}-?)?d{7}$ 加4位区号 -

^(0d{3}-?)?d{7}$  前面必须是0 

^((0d{3}-?)?d{7}|(0d{2}-?)?d{8})$ 3位区号

^(((d{3}-)?[1-9])|((0d{2}-)?[1-9]d))d{6}$ 3 4   //不正确,例子

4, 贪婪

1(.*)?0   => 10, 110, 100

1(.*?)0 => 132323230, 1超大规模fsdfsdf0

去注释:

<!--([sS]*?)-->

//(.*?)$

去标签:

</?([a-zA-Z]+?)>

5, 断言/预查/非捕获 

?: 非捕获

?= 正向判定

?! 正向否判定

?<= 反向判定 (js不支持)

?<! 反向否判定(js不支持)

1, 非捕获

(?:d)[a-zA-Z]+ //数字的那组将不会被后续捕获,通常用在match,exec上, 非捕获在某种程度上可以提高性能

2, 必须是字母+数字

^(?!d+$)(?![a-zA-Z]+$)[0-9A-Za-z]{1,}$

=>转换成

^

    (?!d+$) //不是以全数字结束

    (?![a-zA-Z]+$) //不是以全字母结束

    [0-9A-Za-z]{1,} //数字+字母1位以上

$

3, 必须包含@的字母或数字

^(?=.*@.*)[0-9A-Za-z@]{2,}$

4, 必须包含@, 但不能开头和结束

^(?=.*@.*)(?!^@(.*))(?!(.*)@$)[0-9A-Za-z@]{2,}$

=>

^

            (?=.*@.*) //必须包含@
            (?!^@(.*)) //不能以@开头
            (?!(.*)@$) //不能以@结束
            [0-9A-Za-z@]{2,} //有@的2位以上字母或数字

$

6, 正则的方法

test 验证是否可以匹配

exec 同string.match差不多, 但据说有区别

/reg/.test(value)

/reg/ig.exec(value)

string.match(/reg/g)

string.split(/reg/)

7, 场景应用

   

1,采集图片路径: (js php思路一致)

        var str = '把页面全部源代码抓来fffdsfsd<img src=1>fsdfsd<img alt= src=2 width=323>fsdf';
        var arr = str.match(/<imgs+[^>]+?>/g) || [];//先把全部图片标签抓过来
        arr.forEach(function(val){//遍历所有的结果,这里val就拿到了每个图片的标签str
            var str = val.match(/src=['"]?(.+?)['"]?/) || ['', ''];
            alert(str[1]);

});

2, 密码复杂度

        var pass = 'fsdfsdf';
        var arr = pass.match(/^(?:(d+)|([a-z]+)|([A-Z]+)|([a-zA-Z]+)|([a-zA-Z0-9]+))$/);
        arr[0]//总结果
        arr[1]//纯数字
        arr[2]//纯小写字母
        arr[3]//纯大写字母

原文地址:https://www.cnblogs.com/sunshq/p/3958357.html