浅谈Js正则表达式

284 阅读1分钟

正则表达式是一种文本匹配工具,用来识别、提取符合规则的字符串,提供多种辅助方式,在多种编程语言中都有正则的实现。

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

基本使用

  • 编写正则表达式
  • 调用并匹配。

有两种实例化的方式:字面量和构造函数。

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

字面量形式无法组合,而构造函数基于的字符串可以由多个片段组合而成,更加灵活。 接下来将重点介绍一下构造函数这种更加有趣的使用方式

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

假设有一个匹配邮箱地址的需求:

  • 只能为英文、数字、-、_
  • 必须包含@
  • 后缀只能为:.com、.cn、.net
    //@符号前后的部分正则是一致的,可以复用
    let unit = "[\\w\\-]+";
    let result = `^${unit}@${unit}\\.(?:com|cn|net)$`;

再来一个匹配IP地址的需求:

  • 每个数字不超过255;
  • 最后一位允许通配符*
//首先分析每个数字单元可能为的值:
//一位数字 0-9
//二位数字 [1-9]*
//三位数字 1** 20* 21* 22* 23* 24* 250 251 252 253 254 255
var unitRegStr = "([0-9]|[1-9]\\d|1\\d{2}|20\\d|21\\d|22\\d|23\\d|24\\d|250|251|252|253|254|255)"
var lastPartStr = "*|"+unitRegStr;

var reg = new RegExp(`${unitRegStr}\.${unitRegStr}\.${unitRegStr}\.${lastPartStr}`)

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

再来一个大胆的例子

可不可以通过正则来校验JSON格式的字符串呢? 当然是没问题的,只要把正则表达式编写好即可,可是,真的很好写吗? 然而有以下问题:

  • 数组多层嵌套和对象多层嵌套以及相互嵌套时的解析将会非常复杂,且判断分支呈几何式增长。

只能另辟蹊径:

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

好多了,不是吗?

最后

感谢阅读!