20140829分享正则大纲

1, 正则符号

^ 开头,  [^]非

$字符结尾(每行)

\转义

.匹配除\n外其他词

?前面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 非数字

\n\r

\s 空,包含\f\n\r\t\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位区号 -

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

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

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

4, 贪婪

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

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

去注释:

<!\-\-([\s\S]*?)\-\->

\/\/(.*?)$

去标签:

<\/?([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(/<img\s+[^>]+?>/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]//纯大写字母

posted @ 2014-09-05 16:32  孙首富  阅读(199)  评论(0编辑  收藏  举报