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, 必须包含@的字母或数字
^(?=.*@.*)[[email protected]]{2,}$
4, 必须包含@, 但不能开头和结束
^(?=.*@.*)(?!^@(.*))(?!(.*)@$)[[email protected]]{2,}$
=>
^
(?=.*@.*) //必须包含@
(?!^@(.*)) //不能以@开头
(?!(.*)@$) //不能以@结束
[[email protected]]{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]//纯大写字母