正则表达式是一种文本匹配工具,用来识别、提取符合规则的字符串,提供多种辅助方式,在多种编程语言中都有正则的实现。
这是我参与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;
}
好多了,不是吗?
最后
感谢阅读!