regexr.com
正则表达式
- 字面量写法
var str = 'qaq';
var p = /qaq/g;
console.log(p.test(str));
- 构造函数写法
var str2 = 'aaabc';
var p1 = new RegExp('aaa','g');
console.log(p1.test(str2));
元字符
1.
// `.` 匹配所有规则
2.
// ^ $ 位置字符
^ 匹配字符串开始的位置
$ 匹配字符串结束的位置
var str3 = 'hello world';
console.log(/world$/g.test(str3));//true
3.
// `\w` 匹配数字和字母包括下划线
// `\W` 匹配非数字和字母
4.
// `\d` 匹配数字
// `\D` 匹配非数字
5.
// `\s` 匹配空格
// `\S` 匹配非空格
6.
// `[]` 匹配中括号里面的任意字符
例:/[0-9a-zA-Z]/g 会匹配所有数字字母
/[\u4e00-\u9fa5]/g 会匹配所有中文
// `[^] 匹配除括号中的任意字符
例:/[^a-z]/g 会匹配除a-z之外的所有字符
7.
// `+` 匹配+前面的字符的重复值
例: /qaq+/g 会匹配 qaq qaqq qaqqq,
/[qQ][aA]+/g 会匹配qaaa Qaaa QaaAA
// `*` 匹配0次或多次
例:/[qQ][aA]+[!%^]*/g 可以匹配 qAa^^^ qaa%%% qaa!!
注意:如果遇到 .()$^ 这些字符 需要在前面加上 \ 来转义 \.\(\)\$\^
// `?` 匹配0或者1次
分组匹配
实战例子:
console.log(/(http|https):\/{2}w{3}\.(baidu|google|mi)\.(com|cn)/g.test('http://www.baidu.com'));
console.log(RegExp.$2);
var g = /(?:http|https):\/{2}w{3}\.(baidu|google|mi)\.(com|cn)/g;
console.log(g.test('http://www.baidu.com'));
console.log(RegExp.$2);
正/反向预查
正向预查
?= 正向肯定预查 表示肯定是元 但不匹配
?! 正向否定预查 表示肯定不是元 但不匹配
- 200元
- 2000元
- 200刀
- 200磅
var a = /\d+(?=元)/g;
var b = /\d+(?!元)/g;
反向预查
?<= 反向肯定预查 表示肯定是元 但不匹配
?<! 反向否定预查 表示肯定不是元 但不匹配
- ¥200
- $2000
var g = /(?<=\$)\d+/g;
var d = /(?<!\$|\d)\d+/g;
重复性
{匹配的最小长度,匹配的最大长度}
var a = /\d{4,8}/g;
方法
test() 返回一个布尔值,表示当前模式是否能匹配参数字符串
exec() 用来返回匹配结果。如果匹配,返回一个带有匹配字符串的数组,如果不匹配,返回null。
实际案例
- 检查用户账号
验证规则:由字母,数字,下划线组成,以字母开头 4-16位
var re = /^[a-zA-Z]\w{3,15}$/g
- 匹配手机号
验证规则:11位 以1开头 第二位为3,5,7,8其中一个
var re = /^1[3,5,7,8]\d{9}$/g;
- 匹配电话号码
验证规则: 区号+号码 01088888 010-58888 0523-5555 区号3-4位 可有- 号码7-8位
var re = /^0\d{2,3}-?\d{7,8}/g;
- 匹配身份证号
验证规则:18位或15位 15位:全是数字 18位:前17都是数字,最后一位可能是X或x
var re = /(^(\d{15}$)|(^\d{18}$)|(^\d{17}(\d|x|X)$))/g;
- 匹配邮箱
验证规则:第一部分@第二部分.com|cn|net
var re = /^[a-zA-Z0-9-._]+[@][a-zA-Z0-9-._]+\.(com|cn|net)$/g