正则表达式
正则表达式:用于匹配规律规则的表达式,正则表达式最初是科学家对人类神经系统的工作原理的早期研究,现在在编程语言中有广泛的应用,经常用于表单校验,高级搜索等。
创建正则表达式
构造函数的方式
var regExp = new RegExp(/\d/);
正则字面量
var regExp = /\d/;
正则的使用
/\d/.test("aaa1");
元字符
正则表达式由一些普通字符和元字符组成,普通字符包括大小写字母、数字等,而元字符则具有特殊的含义。
常见元字符
|
表示或,优先级最低
()
优先级最高,表示分组
字符类的元字符
[]
在正则表达式中表示一个字符的位置,[]里面写这个位置可以出现的字符。
console.log(/[abc]/);//匹配a,b,c
[^]
在中扩号中的^表示非的意思。
//^表示该位置不可以出现的字符
console.log(/[^abc]/);//匹配除了a,b,c以外的其他字符
[a-z]
[1-9]
表示范围
console.log(/[a-z]/.test("d"));//小写字母
console.log(/[A-Z]/.test("d"));//大写字母
console.log(/[0-9]/.test("8"));//数字
console.log(/[a-zA-Z0-9]/);//所有的小写字母和大写字母以及数字
边界类元字符
我们前面学习的正则只要有满足的条件的就会返回true,并不能做到精确的匹配。
^表示开头 []里面的^表示取反
$表示结尾
console.log(/^chuan/.test("dachuan"));//必须以chuan开头
console.log(/chuan$/.test("chuang"));//必须以chuan结尾
console.log(/^chuan$/.test("chuan"));//精确匹配chuan
//精确匹配chuan,表示必须是这个
console.log(/^chuan$/.test("chuanchuan"));//fasle
量词类元字符
量词用来控制出现的次数,一般来说量词和边界会一起使用
【13-正则量词.html】
*
表示能够出现0次或者更多次,x>=0;+
表示能够出现1次或者多次,x>=1?
表示能够出现0次或者1次,x=0或者x=1{n}
表示能够出现n次{n,}
表示能够出现n次或者n次以上{n,m}
表示能够出现n-m次
思考:如何使用{}来表示*+?
正则的使用
正则测试
-
验证QQ
- 只能是数字
- 开头不能是0
- 长度为5-11位
var qqReg = /^[1-9]\d{4,10}$/;
-
验证手机
- 11位数字组成
- 号段13[0-9] 147 15[0-9] 17[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-6位之间
- 汉字范围[\u4e00-\u9fa5]
var nameReg = /^[\u4e00-\u9fa5]{2,6}$/;
元字符归纳
. 除了\n(回车换行)以外的任意字符
[] 1.范围 2.把元字符的意义干掉
[0-9] 0-9之间的任意一个数字
[a-z] 任意一个小写字母
[Z-A] 任意一个大写字母
[a-zA-Z] 任意一个字母不管大小写
[0-9a-zA-Z] 任意一个数字或者是任意一个字母
| 或者
() 分组,提升优先级
* {0,} 前面的表达式出现了0次到多次
+ {1,} 前面的表达式出现了1次到多次
? {0,1} 前面的表达式出现了0次或一次
{n} 前面的表达式出现了n次
^ 以什么开头 eg: ^[0-9]表示以数字开头
$ 以什么结尾 eg: [0-9]$表示以数字结尾
\d 任何一个数字
\D 任何一个非数字
\s 任何一个空白符 空格 tab制表符
\S 任何一个非空白符
\w 非特殊符号
\W 特殊符号
\b 单词边界
正则表达式方法
//macth()显示匹配到的字符串加到数组中
//提取数字
var str1 = "中国移动:10086,中国联通:10010,中国电信:10000"
var arr1 = str1.match(/\d{5}/g);
console.log(arr1);//["10086", "10010", "10000"]
//提取日
var str2 = "2019-08-06";
var arr2 = str2.match(/(\d{4})[-](\d{2})[-](\d{2})/g);//用括号将匹配到的字符串分组
console.log(arr2);//["2019-08-06"]
console.log(RegExp.$3);//06 显示第三组字符串,RegExp.$固定写法
var arr3 = str2.split("-");
console.log(arr3);//["2019", "08", "06"]
//字符串替换
var str3 = "五十六个民族五十六朵花,五十六个闰土来偷瓜,五十六只钢叉手中拿,谁是猹啊谁是猹!";
var str3 = str3.replace(/五十六/g,"五十七");//1.正则表达式里的字符串不加引号 2.若不加g则只能替换掉第一个“五十六”
console.log(str3);//五十七个民族五十七朵花,五十七个闰土来偷瓜,五十七只钢叉手中拿,谁是猹啊谁是猹!
//除去空白符
var str4 = " asda sd ";
str4 = str4.trim();//trim()只能去除头尾空白符 trim-修剪 切除
str4 = str4.replace(/\s/g,"");
console.log("-----"+str4+"-----");//-----asdasd-----
//替换所有h为S
//全局匹配加忽略大小写
var str5 = "hHabscdhHS";
var str5 = str5.replace(/[h]/ig,"S");
console.log(str5);//SSabscdSSS