Day10 正则表达式、字符串中支持正则API

76 阅读2分钟

一、正则表达式

定义字符串中字符出现规则的表达式 何时使用:切割、替换、【验证】! 如何使用:语法:/正则表达式/;

1、最简单的正则就是关键字原文 "no" -> /no/后缀
    后缀:g:找全部	i:忽略大小写

2、备选字符集:/^[备选字符集]$/;
	强调:
        1、一个中括号,只管一位字符
        2、问题:正则表达式默认只要满足了就不管后续了,而我们做验证的人,希望的是用户从头到尾完全按照我们的要求来,希望完全匹配
		解决:前加^后加$,两者同时使用,代表要求从头到尾【完全匹配】/^[备选字符集]$/; - 验证必加
	特殊:如果备选字符集中ascii码是连续的,那么可用-省略掉中间部分
		比如:
		一位数字:[0-9]
		一位字母:[A-Za-z]
		一位数字、字母、下划线:[0-9A-Za-z_]
		一位汉字:[\u4e00-\u9fa5]
		一位数字、字母、汉字、下划线:[0-9A-Za-z\u4e00-\u9fa5_]
                除了xxx之外的:[^0-9] - 很少使用,范围太广了

	3、预定义字符集:前辈们提前定义了一些字符集,为了方便程序员开发 - 简化了备选字符集
		一位数字:\d
		一位数字、字母、下划线:\w
		一位空白字符:\s	空白字符:空格、制表符、换行
		一位除了换行外的任意字符:.	- 很少使用,范围太广了
                
		建议:优先使用预定义,预定义满足不了再用备选字符集补充

                问题:不管是备选字符集,还是预定义字符集,一个只管一位

	4、量词:规定了一个字符集出现的次数:
		1、有明确数量:
			字符集{n,m}:前边相邻的字符集,至少n个,最多m个
			字符集{n,}:前边相邻的字符集,至少n个,多了不限
			字符集{n}:前边相邻的字符集,必须n个

		2、无明确数量:
			字符集?:前边相邻的字符集,可有可无,最多1个
			字符集*:前边相邻的字符集,可有可无,多了不限
			字符集+:前边相邻的字符集,至少一个,多了不限

		5、选择和分组:
			选择:在多个规则中选一个
				规则1|规则2
			分组:将多个字符集临时组成一组子规则
				(规则1|规则2)

		6、指定匹配位置
			开头:^
			结尾:$
			特殊:两者同时使用,前加^后加$,表示从头到尾要求完全匹配 - 只要你做【验证】
		
		7、密码强度:2-4位,可以输入数字、字母,但是必须出现一位大写和一位数字的组合?
			/^[0-9A-Za-z]{2,4}$/
			预判公式:
				(?![0-9]+$) -> 不能全由数字组成,可能有大写、小写、汉字、日文、韩文、特殊符号....
				(?![a-z]+$) ->不能全由小写字母组成,可能有大写、数字、汉字、日文、韩文、特殊符号....
				(?![0-9a-z]+$) -> 不能全由数字组成,也不能全由小写字母组成,也不能全由数字和小写的组合组成,至少要有点别的

			比如:
				/^(?![0-9a-z]+$)(?![A-Za-z]+$)[0-9A-Za-z]{2,4}$/; - 2-4位,可以输入数字、字母,但是必须出现一位大写和一位数字的组合?
				/^(?![0-9a-z]+$)(?![A-Za-z]+$)(?![A-Z0-9]+$)[0-9A-Za-z]{2,4}$/; - 2-4位,可以输入数字、字母,但是必须出现三者的组合?
				/^(?![0-9A-Za-z]+$)[0-9A-Za-z_]{2,4}$/; - 至少要有一个下划线

二、字符串中支持正则API

1、切割:var arr=str.split("固定切割符"/RegExp)

2、替换:很有可能出现在笔试中,而且真实开发也会遇到
		1、基础替换法:
			str=str.replace(RegExp,"新内容");
			//replace支持正则,并且搭配上后缀g就可以找到全部
			//缺陷:替换的新内容是一个固定的

		2、高级替换法:
			str=str.replace(RegExp,function(a,b,c){
				console.log(a);//正则匹配到的关键字
				console.log(b);//正则匹配到的关键字的下标
				console.log(c);//原字符串
				return 判断a关键字的长度,而返回不同的星星数量
			});

		3、格式化:
			var id="500103198602215933";
			var reg=/\d{6}(\d{4})(\d{2})(\d{2})\d{4}/;
			id=id.replace(reg,function(a,b,c,d,e,f){
				//在replace的时候,正则出现了分组,我们会得到更多的形参
				//在形参a的后面就会出现n个形参,具体看你有多少分组
				//第1个分组获得的内容会保存到第2个形参之中
				//第2个分组获得的内容会保存到第3个形参之中
				...
				//倒数第二个是下标
				//倒数第一个是原文
				return `${b}${c}${d}日`
			})
			console.log(id);

三、正则对象

创建:
    1、直接量:var reg=/正则表达式/后缀;
    2、构造函数:var reg=new RegExp("正则表达式","后缀");

API:
    验证:var bool=reg.test(用户输入的);