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]//纯大写字母