1. 什么是正则
1. 正则只和字符串有关,换言之正则只和字符串打交道;
2. 正则用来操作(匹配和捕获)字符串的一系列规则;
匹配:判断你是否符合我的规则: 返回值:布尔值; test
捕获:把符合我们规则的内容拎出来; 拿到的:字符串;
2. 正则的定义
正则创建的两种方式:字面量 和 实例
两种创建方式的区别:
1)实例创建时,特殊含义的字符需要转义(\);
2)实例创建可以进行变量的拼接,但是字面量方式创建,不能拼接变量;
var reg=/\d/; // 字面量创建
var reg=new RegExp('^'+str+'$'); // 实例创建
3. 正则由两部分组成:元字符 和 修饰符
元字符包含:代表特殊意义的元字符 和 代表次数的量词元字符
1. 代表特殊意义的元字符:
\ ---- 转义字符
| ---- 或
() ---- 分组
. ---- 除了\n以外的其他字符
\n ---- 换行(一般用在控制台的换行)
\b ---- 开头结尾和空格
^
$
\d 数字 \w 数字字母下划线 \s 空格
\D 非数字 \W 非数字字母下划线 \S 非空格
[abc] abc三个中的任何一个 [^abc] 除了abc这三个的任何一个
[a-z] 字母中的任何一个 [^a-z] 非字母
2. 代表次数的量词元字符:
* 0到多
+ 1到多
? 0次或1次;
{n} 正好几次
{n,} 至少n次
{n,m} n次到m次
修饰符:
g 全局 global
i 忽略大小写
m 换行操作
4. 常用的正则判断
1. 有效电话号码
var reg = /^1/d{10}$/;
2. 身份证号码
var reg = /^(\d{17})(\d|X)$/; // 最后一位有可能是X
var reg = /^(\d{2})(\d{4})(\d{4})(\d{2})(\d{2})(\d{2})(\d)(\d|X)$/
3. 23或者24
var reg = /^(23|24)$/ // 用到或的时候一定要加()
4. 年龄在18~67岁之间
var reg = /^(18|19)|([2-5]\d)|(6[0-7])$/;
5. 去除数位空格
var reg = /(^ +)|( +$)/;
6. 非空验证
var reg = /^\s+$/;
7. 邮箱验证
var reg = /^([\w.-]+)@([0-9a-zA-Z]+)(\.[a-zA-Z]{2,4}){1,2}$/
8. 中文名字
var reg = /^[\u4e00-\u9fa5]{1,4}$/ // 基本汉字的Unicode码范围: 4E00-9FA5
9. 偷小说:
var reg=/<[^<>]+>/g;
5. 工作中遇到的正则
1. 密码匹配: 要求8~30位,同时包含:大写字母、小写字母、数组的字符串
/^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z])[a-zA-Z0-9]*$/
2. 8 - 30 个字符,必须同时包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*-+=|{}[]:;'<>,.?/ 中的特殊符号)。
/(?=^.{8,30}$)(?!^[\d\W_]*$)(?!^[\da-z]*$)(?!^[\dA-Z]*$)(?!^[\W_a-z]*$)(?!^[\W_A-Z]*$)(?!^[a-zA-Z]*$).*$/
6. 正则捕获的特点:
1. 懒惰性:解决办法-用全局g;
eg:每次都是从索引0开始查找;
用了全局g,lastIndex每次查找都是从找到内容的下一个元素的索引开始查找;
2. 贪婪性:解决办法-用?
7. 懒惰性
每一次执行exec只捕获第一个匹配的内容,在不进行任何处理的情况下,在执行多次捕获,捕获的还是第一个匹配的内容。
例子:
var reg = /\d+/;
var str = 'qweasd2016qazwsx2017';
var res = reg.exec(str);
console.log(res) // ['2016',index:6,input:'qweasd2016qazwsx2017']
//第二次通过exec捕获的内容还是第一个"2016"
var res = reg.exec(str);
console.log(res) // ['2016',index:5,input:'qweasd2016qazwsx2017']
解决的方法: — g
var reg = /\d/g;
var str = 'woshi2016ni2017';
console.log(reg.lastIndex) // 0
console.log(reg.exec(str)) // ["2", index: 5, input: "qweasd2016qazwsx2017"]
8. 贪婪性
贪婪性 正则的每一次捕获都是按照匹配最长的结果捕获的,例如:2符合正则、2015也符合正则,我们默认捕获的是2015
例子:
var reg = /\d+/g;
var str = 'as2015xs2016er2017';
console.log(reg.exec(str)); //["2015", index: 2, input: "as2015xs2016er2017"]
解决办法: —– ?
var reg = /\d+?/g;
var str = 'as2015xs2016er2017';
console.log(reg.exec(str)); // ["2", index: 2, input: "as2015xs2016er2017"]