更好地编写Js正则表达式

什么是正则

一种文本匹配工具,用来识别、提取符合规则的字符串,提供多种辅助方式。

普通的使用方式

编写正则表达式 => 调用匹配。

两种编写方法:字面量和构造函数模式:

// 字面量
let regIns1 = /^\d$/;
let regIns2 = new RegExp("^\\d$");

字面量形式无法组合,而构造函数基于的字符串可以由多个片段组合而成,增强了灵活性。

一些复杂的正则表达式采用字面量形式编写非常容易出错,而对字符串进行分类组合后再通过构造函数进行实例化更加的清晰明朗

构造函数模式:正则的切分与组合

还是以例子说明:

  1. 编写检查email地址的正则:
    • 允许:英文、数字、-、_
    • 必须由@
    • 英文、数字、-、_
    • 后缀为:.com、.cn、.net
  2. 编写一个验证IP的正则
    • 每个数字不超过255;
    • 最后一位允许通配符*
    • 最后一位允许区间-;且右区间大于等于左区间:127.0.0.1-100;
    • 通配符与区间符不能同时存在
    • 允许多个IP地址存在,以;分割。

下面我们使用拆分组合方式编写正则表达式。

先处理Email地址:

// 校验email
function checkEmail(str){
	let unit = "[\\w\\-]+";
	let result = `^${unit}@${unit}\\.(?:com|cn|net)$`;
	return new RegExp(result).test(str)
}

再来看IP地址,由于表达式无法进行数值的判断,所以单凭正则无法解决该问题,需要编写函数解析判断处理

function checkIp(string){
	var number = "([1-9]?\\d|1\\d{2}|2[0-4]\\d|25[0-5])";//IP位数字
	var ipAddress = `(${number}\\.${number}\\.${number}\\.(${number}|\\*|${number}\\-${number}))`;//正常的IP:127.0.0.1/*/-129;
	var result = `^(${ipAddress};)*${ipAddress};?$`;//最后的;可有可无
	var regExp = new RegExp(result)
	function parseStrJudge(ipStr){
		//解析:.数字-数字,
		// 确保前面数字 <= 后面数字
		var parseReg = new RegExp(`\\.(${number})\\-(${number})`,'g');
		var compareArr = [];
		var tempRes = null;
		while( tempRes= parseReg.exec(ipStr)){
			console.log((tempRes)if( Number(tempRes[1]) > Number(tempRes[2]) ){
				return false;
			}
		}
		return true;
	}
	return regExp.test(string) && parseStrJudge(string)
}

看起来明显清晰,而且更好测试了不是嘛?

一个大胆的例子

之后,又设想通过正则来验证JSON字符串,这个工作可不小,有以下设想:

  • 编写验证number、boolean、string、null、array、object的正则
  • 对于array和object再借助解析递归地判断
  • 数组多层嵌套和对象多层嵌套以及相互嵌套时的解析将会非常复杂,且判断分支呈几何式增长,于是作罢。

还是站在巨人的肩膀上来的简单:

function checkJSON(str){
	try{
		JSON.parse(str);
	}catch(e){
		return false;
	}
	return true;
}

over

感谢阅读!

你可能感兴趣的:(前端开发,正则表达式)