正则表达式
含义: 定义一个正则规则,用来检测某个字符串是否符合这个规则.
1. 创建正则表达式对象
字面量的方式
//创建一个匹配"web"的正则表达式
var reg = /web/;
//验证str1和str2是否符合正则的规则
var str1 = "kajsdks";
var str2 = "kasjwebk";
console.log(reg.test(str1)); //false
console.log(reg.test(str2)); //true
new 关键字
//创建一个匹配"java"的正则表达式
var reg1 = new RegExp('java');
var str3 = "akhdjjsavjava";
console.log(reg1.test(str3)); //true
正则参数: 参数i-不区分大小写,g-全局匹配,m-多行匹配
//创建一个匹配"web"的正则表达式,不区分大小写
var str4 = "javahakjhsawebufih";
var reg = new RegExp('web','i'); //true
console.log(reg2.test(str4));
//创建一个匹配"java"的正则表达式,不区分大小写且全局匹配
var reg3 = /java/ig;
console.log(reg3.test(str4)); //true
2. 常用匹配规则
任意字符 .
字母,下划线,数字 \w
任意空白符 \s
匹配数字 \d
匹配非数字 \D
或匹配 |
匹配字符串开始 ^
匹配字符串结束 $
匹配包含某字符或字符串(如ab)里面的任意一个 [ab]
只要有一个不是某(如a)字符都能匹配 [ ^a]
转义字符: / => / . => \ . \ => \ \
//1.创建一个匹配任意字符的正则
/./
//2.创建一个匹配至少包含三个字符的正则,字符可以是字母,数字,下划线
/\w\w\w/
//3.创建一个匹配"ab sab"的正则
/ab\ssab/
//4.创建一个匹配2个数字的正则
/\d\d/
//5.创建一个匹配包含一位非数字的正则
/\D/
//6.创建一个匹配正则匹配,只要有13或18都行
/13|18/
//创建一个匹配abc或xyz的正则
/abc|xyz/
//7.网址必须是以http开头
/^http/
//8.必须是com结尾
/com$/
//9.字符串中只要有abc中的任意一个都能匹配
/[abc]/
//字符串中只要有0到9中的任意一个都能匹配
/[0-9]/
//字符串只要有a到z中的任意一个都能匹配
/[a-z]/
//只要有一个不是x的字符都能匹配
/[^x]/
//只要有一个不是a,b,c的字符都能匹配
/[^abc]/
//匹配http://baidu.com
/^http:\/\/baidu\.com$/
3. 重复匹配
重复出现零次或一次 ?
重复出现一次或多次 +
重复出现零次或多次 *
重复出现n次 {n}
至少出现n次 {n,}
重复出现m到n次,其中m<n
//写一个匹配网址的正则,只匹配前面,后面先不管
/^https?:\/\//
//写一个正则,字母a必须有一个或以上
/a+/
//写一个正则,字母a出现0次或多次都可以
/a*/
//写一个简单的日期匹配正则
/\d{4}-\d{2}-\d{2}/
//写一个简单的手机号码匹配
/^1[3-9]\d{9}$/
//写一个正则,要求8至少出现4次或以上
/8{4,}/
//写一个正则,数字,字母或下划线的位数是6到12位
/\w{6,12}/
4. 正则表达式应用
1. /^(0|86|17951|12593)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57])[0-9]{8}$/
手机号:
- (0|86|17951|12593)? 手机号码前缀
- (13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57] |19[0-9]) 手机号码前3位
- [0-9]{8} 手机后8位
2. /\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*/
邮箱地址匹配:
- \w+([-+.]\w+)*
- @\w+([-.]\w+)*
- \.\w+([-.]\w+)*
3. /^https?:\/\/(([a-zA-Z0-9_-])+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*$/i
网址:
- 协议:https?:\/\/
- 域名:(([a-zA-Z0-9_-])+(\.)?)*
- 端口:`(:\d+)?
- 参数:(\/((\.)?(\?)?=?&?[a-zA-Z0-9_-](\?)?)*)*
5. 分组
//1.括号表示一个整体
/^(abs|nps|ysl).*/ //必须以abs,nps或ysl开头,其他任意字符有无或多个
//2.分组(括号内表示一个分组,可以用'\数字'来表示)
/<([a-zA-Z]*[1-6]?>).*<\/\1/ //一个html标签格式
//3.字符串替换分组: 替换里面是用$,而正则里面使用\,区分开来!
var str = '13689327311';
str = str.replace(/(\d{3})(\d{4})(\d{4})/,'$1****$3');
console.log(str); //手机号中间四位不显示136****7311
6. 贪婪匹配和懒惰匹配
//1.字符串的match方法,可以检查匹配了\w+几次
var str = 'aajkshdkaalallfalf';
console.log(str.match(/a+/g));
//2.贪婪匹配,尽可能多的匹配(默认是贪婪匹配+,*)
var str = document.body.innerHTML;
//贪婪匹配只能得到一个匹配项
str.match(/^https?:\/\/.*\.(png|jpg|jpeg|git)$/);
//3.懒惰匹配,尽可能少的匹配,在重复的后面加上?即可
var str = document.body.innerHTML;
//懒惰匹配可以得到多个匹配项
str.match(/^https?:\/\/\.(png|jpg|jpeg|gif)$/);