正则表达式
正则表达式:用于匹配规律规则的表达式,经常用于表单校验,高级搜索等。
1. 创建正则表达式
构造函数
var regExp = new RegExp(/\d/);
正则字面量
var regExp = /\d/;
2. 元字符
正则表达式由一些普通字符和元字符组成,普通字符包括大小写字母、数字等,而元字符则具有特殊的含义。
(1) 常见元字符 (重要: \d \w . )
元字符 | 等同于 | 含义 |
---|---|---|
. | [^\n\r] | 除了换行和回车之外的任意字符 |
\d | [0-9] | 数字字符 |
\D | [^0-9] | 非数字字符 |
\w | [a-zA-Z0-9_] | 单词字符(所有的字母数字和_) |
\W | [^a-zA-Z0-9_] | 非单词字符 |
\s | [\f\r\n\t\v] | 不可见字符,包含空格 |
\S | [^\f\r\n\t\v] | 可见字符 |
特殊字符转换:
\’ 单引号 \" 双引号 \& 和号 \\ 反斜杠 \n 换行符 \r 回车符 \t 制表符(横) \v 制表符(纵) \b 退格符 \f 换页符
(2) 优先级
| 表示或,优先级最低
()表示分组,优先级最高
(3) 字符类的元字符
[ ]表示一个字符的位置 []里面写这个位置可以出现的字符
console.log(/[abc]/); // 匹配a,b,c
[^]表示非 是否包括除了XX以外的字符串
//[^0]:除了0以外的字符
console.log(/[^0]/.test("1aaa000")); // true
console.log(/[^0]/.test("a")); // true
[a-z] [1-9] [a-zA-Z0-9] 表示一个字符的位置的范围
console.log(/[a-z]/.test("d")); //小写字母 // true
console.log(/[A-Z]/.test("d")); //大写字母 // false
console.log(/[0-9]/.test("8")); //数字 // true
console.log(/[a-zA-Z0-9]/); //所有的小写字母和大写字母以及数字
(4) 边界类元字符
用于精确的匹配。
^ 表示开头 []里面的^表示取反
$ 表示结尾
精确匹配: 前面^后面$
console.log(/^chuan/.test("dachuan")); // 必须以chuan开头 // false
console.log(/chuan$/.test("chuang")); // 必须以chuan结尾 // false
console.log(/^chuan$/.test("chuan")); // 精确匹配chuan // true
// 精确匹配chuan,表示必须是这个,即使前面后面都有该字符
console.log(/^chuan$/.test("chuanchuan"));//fasle
(5) 量词类元字符
量词用来控制出现的次数,一般来说量词和边界会一起使用
// 量词用来控制出现次数的
console.log(/a/.test("abc")); // true
console.log(/^a/.test("abc")); // true
console.log(/^a$/.test("abc")); // false
- *表示出现0次或者更多次,x>=0
- +表示出现1次或者多次,x>=1
- ?表示出现0次或者1次,x=0或者x=1
- {n}表示连续出现n次
- {n,}表示连续出现n次或者n次以上
- {n,m}表示连续出现n-m次
// 思考:如何使用{}来表示* + ?
*{0, } +{1, } ?{0,1}
3. 正则的使用
(1) 正则测试 test
reg.test(str);
- 验证座机
// 比如010-12345678 0797-1234567
// 开头是3-4位,首位必须是0
// -后面是7-8位
var phoneReg = /^0\d{2,3}-\d{7,8}$/;
- 验证姓名
// 只能是汉字
// 长度2-6位之间
// 汉字范围[\u4e00-\u9fa5]
var nameReg = /^[\u4e00-\u9fa5]{2,6}$/;
- 验证QQ
// 只能是数字
// 开头不能是0
// 长度为5-11位
var qqReg = /^[1-9]\d{4,10}$/;
- 验证手机
// 11位数字组成
// 号段13[0-9] 147 15[0-9] 177[0178] 18[0-9]
var mobileReg = /^(13[0-9]|147|15[0-9]|17[0178]|18[0-9])\d{8}$/;
- 验证邮箱
// 前面是字母或者数字
// 必须有@
// @后面是字母或者数字
// 必须有.
// .后面是字母或者数字
var emailReg = /^\w+@\w+(\.\w+)+$/;
(2) 字符串替换 replace
str.replace(reg);
str = str.replace(/ad/g,‘xx’); 将所有的ad替换成xx
str = str.replace(/ad/gi,‘xx’); 将所有的ad替换成xx i:忽略大小写
str = str.replace(/ad|AD/g,‘xx’); 将所有的ad/AD替换成xx
(3) 字符串匹配 match
str.match(reg);
匹配某个字符串中所有符合规律的字符串,支持参数传正则,返回的是一个匹配的数组。
正则里没有传/g查找所有,返回结果和reg.exec(str)相同。
str.match(/1[3-9]\d{9}/g);
var str = "甲手机号是:18511241111,乙手机号是:13211111111,丙手机号是:18522223333,丁手机号是:18511112293";
// 需求:把字符串中所有的手机号找出来。
console.log(str.match(/1[3-9]\d{9}/g));
// 打印结果:["18511241111", "13211111111", "18522223333", "18511112293"]
(4) 正则提取 exec
reg.exec(str);
提取匹配的字符串的每一个部分,()进行分组。
返回的是一个提取的数组,包含第一个匹配项。没有匹配项返回null。
该数组包含两个额外的属性: index 和 input。
var str = "今天是2018-05-11,要求得到年月日";
// 加小括号, 返回数组里的第一个元素是匹配到的结果, 其他元素(2-3-4)是对应匹配小括号里内容
var reg1 = /(\d{4})-(\d{2})-(\d{2})/;
// 不加小括号, 返回数组只有一个匹配值
var reg2 = /\d{4}-\d{2}-\d{2}/;
console.log(reg1.exec(str));
// ["2018-05-11", "2018", "05", "11", index: 3, input: "今天是2018-05-11,要求得到年月日", groups: undefined] --数组长度为4,后面的是属性
console.log(reg2.exec(str));
// ["2018-05-11", index: 3, input: "今天是2018-05-11,要求得到年月日", groups: undefined] --数组长度为1
方法总结:
正则表达式有2个方法:
reg.test() 测试 判断某个字符串是否符合正则的规律,常用于表单校验
reg.exec() 提取 提取匹配的字符串的每一个部分,()进行分组
字符串有2个方法:
str.replace() 替换 正则的替换
str.match(); 匹配 匹配某个字符串中所有符合规律的字符串,支持参数传正则