# 正则表达式

# 1. 初识

表达式		  表示的是字符区间
[acde]		表示acde中的任何一个数据
[^acde]      表示除了acde中的任何一个数据
[a-z]        表示a-z中的任何一个数据
[A-Z]        表示A-Z中的任何一个数据
[A-z]        表示A-z中的任何一个数据
[0-9]        表示0-9中的任何一个数据

作用:专用来匹配字符串

正则是一个引用数据类型

str.match(正则)
    按照指定的正则规则 匹配出str中的符合规则的字符
    如果没有匹配出来 则返回null
reg.test(字符串)
    检验字符串中有没有reg对应的规则
    如果有 则返回true
    如果没有 则返回false

# 2. 元字符

元字符 实质也是表达式 也只能匹配到一个字符

\w  	[0-9A-z_]
\W  	[^\w]

\d  	[0-9]
\D  	[^\d]

\s  	匹配能够使字符串产生间隙的字符
\S 		[^\s]

.   	[^\n]

# 3. 修饰符

# 3.1 修饰符

	i	忽略大小写  ingorecase
	g	全局匹配    global
	m	换行匹配
	n	形容词

# 3.2 形容词

形容词:修饰字符n (断言)

n$			匹配到在结尾位置的字符n
^n			匹配到在开头位置的字符n

x(?=n)		匹配到后面紧跟着字符n的x
x(?!n)		匹配到后面没有紧跟着字符n的x

(?<=n)x		匹配到前面紧跟着字符n的x
(?<!n)x		匹配到前面没有紧跟着字符n的x

\1 \2 \3 反向引用 表示匹配出的值的复制品

// var str = 'abaabbeeff';
// var reg = /(\w)\1(\w)\2(\w)\3/g;
// console.log(str.match(reg))	-->[aabbee]

str.replace(字符串1/正则,字符串2/回调函数) 用字符串2替换字符串1

var str = 'get-element-by-id'; 
var reg = /-[a-z]/g;
var newStr = str.replace(reg,function(){
    return arguments[0][1].toUpperCase()
});
console.log(newStr);// getElementById

# 3.3 量词

无论是表达式还是元字符 都只能匹配一个字符 量词:表示数量 尽可能多匹配字符 (贪婪匹配) 在量词后面加上 ? 就能够取消贪婪匹配

		{x}     匹配x个字符
		{x,y}   匹配[x,y]个字符
		{x,}    匹配至少x个字符
		x+      匹配至少一个字符
		x*      匹配至少0个字符
		x?      匹配[0,1]个字符

# 4. 示例

	var x = 'fkhsafh';
	var reg1 = /x/gi;//  字面量形式
	var newReg = new RegExp(x,'gi');

//1.检测一个数据是否是数字     数字中有整数,小数,负数等
	var str = '-10.25';  //  25 
	var reg = /^-?\d+(\.\d+|)$/
	//console.log(str.match(reg))

//2.检测是否是本地电话    000-12345678    0000-12345678
	var str2 = '0000-12345678';
	var reg2 = /^\d{3,4}-\d{8}$/;
	//console.log(str2.match(reg2))

//3. get-element-by-id			转换成  getElementById
	var str3 = 'get-element-by-id';
	var reg3 = /-[a-z]/g;
	console.log(str3.replace(reg3,function(){
    	return arguments[0][1].toUpperCase()
	}))

//4.  aaabbbccc		cccbbbaaa			转换成  CCCBBBAAA  
	var str4 = 'aaabbbccc';
	var reg4 = /(\w)\1\1(\w)\2\2(\w)\3\3/;
	//console.log(str4.replace(reg4,'$3$3$3$2$2$2$1$1$1').toUpperCase())

//5.把www.tain.com				转换成  www.tanzhou.com
	var str5 = 'www.tianmao.com';
	var reg5 = /.[a-z]+./;
	//console.log(str5.replace(reg5,'.tanzhou.'))


//6 封装函数 用'Batman'替换'ABC'	"ABC is an great man, which means ABC is great"
	var str6 = 'ABC is an great man, which means ABC is great';
	function heaven(s,origin,target){
    	//var reg6 = /origin/g;
    	var reg = new RegExp(origin,'g');
		return s.replace(reg,target)
	}
	console.log(heaven(str6,'great','heaven'))
	//console.log(str6.replace(reg6,'Batman'))

//7  "<p class='on'>我是海文</p>"		转换成   '我是海文'
	var str7  = '<p class="on">heaven</p>';
	//var reg7 = /<[^>]+>/g;
	var reg7 = /(?<=>).+(?=<)/
	//console.log(str7.replace(reg7,''))
	//console.log(str7.match(reg7)[0]) 

//8  把'div#heaven.on'		转换成    "<div id='heaven' class='on'></div>"
	var str8 = 'div#heaven.heaven';
	var reg8 = /(\w+)#(\w+).(\w+)/;
	str8.replace(reg8,'<1 id="2" class="3"></1>')
	//str8.replace(/#(\w+)/,' id="1"').replace(/.(\w+)/,' class="1"').replace(/(\w+)(.+)/,'<12></$1>');


//9  检测密码 密码必须包含大小写字母数字特殊符号 
	var str9 = 'cdVb1231a!!'
	//var reg9 = /[0-9][A-z][\$\~\(\)\*\@\&\%\#\!]/
	//console.log(/[0-9]{3,5}/.test(str9)&&/[A-Z]+/.test(str9)&&/[a-z]+/.test(str9)&&/[\$\~\(\)\*\@\&\%\#\!]/.test(str9))

//10  8888888888   转换成		8,888,888,888
	var str10 = '888888888888';
	var reg10 = /(?=\B(\d{3})+$)/g;//后面紧跟着3个数字的空串

Last Updated: 2020-5-15 0:34:44